sql - Postgresql 更新左连接
问题描述
因此,我有以下代码根据 id 和语言代码更新语言字符串表。如果我使用相同的 from 表达式执行 SELECT,它只会选择一行。如果我更新,它会更新所有行。我哪里错了?
UPDATE shopmaster.catalog_lang SET shortname='TEST'
FROM shopmaster.catalog_lang cl LEFT JOIN shopmaster.lang l ON cl.langid=l.langid
WHERE cl.catalogid=7 AND l.code='fr';
这是两个表的定义:
CREATE TABLE IF NOT EXISTS shopmaster.lang(
langid SERIAL,
name TEXT,
code TEXT,
active BOOLEAN,
donotdelete BOOLEAN,
PRIMARY KEY (langid)
CREATE TABLE IF NOT EXISTS shopmaster.catalog_lang(
catalogid INT references shopmaster.catalog(catalogid),
langid INT references shopmaster.lang(langid),
title TEXT,
shortname TEXT,
dirname TEXT,
PRIMARY KEY (catalogid, langid)
);
解决方案
不要重复在FROM
. 所以:
UPDATE shopmaster.catalog_lang cl
SET shortname = 'TEST'
FROM shopmaster.lang l
WHERE cl.langid = l.langid AND cl.catalogid = 7 AND l.code = 'fr';
在 Postgres 中,对表的每个引用都是独立的。您的更新相当于SELECT
:
SELECT . . .
FROM shopmaster.catalog_lang CROSS JOIN
shopmaster.catalog_lang cl LEFT JOIN
shopmaster.lang l
ON cl.langid = l.langid
WHERE cl.catalogid = 7 AND l.code = 'fr';
这绝对不是你想要的。
推荐阅读
- javascript - 唯一的默认状态/类来反应切换
- php - 从 CURL 响应中获取特定行
- r - 在 R 中的地图上添加多边形,CRS 问题
- download - 有没有办法为用户编写批量下载(zip?)以下载我页面上的所有附件?
- java - 错误 java.lang.NoSuchMethodError - 外部库
- oracle - 连接数据库oracle进行自动化测试(机器人框架)
- java - 在 Java 应用程序中对 Cloud Scheduler 进行身份验证
- ruby-on-rails - 比较项目的 URL 结构
- android - 如何使用 Mockk 创建观察者
- sql - 编辑插入的表 sql