问题描述
我是 sql 的新手,我无法使以下 sql 查询起作用!别名和 where 子句似乎存在问题,但我没有找到任何解决方法...
有人可以启发我吗?
Table t_adresse (SCHEMA ab)
-------
ad_nomvoie | ad_numero | action |
Privet Drive 4
KameHouse St 12
Table t_adresse (SCHEMA poma)
-------
ad_nomvoie | ad_numero |
Privet Drive 8
KameHouse St 12
After my update I would like to get this result below (if I had to run the select "defined" by "req1") :
-------
ad_nomvoie (from ab) | ad_numero (from ab) | ad_nomvoie (from poma) | ad_numero (from poma) | action
Privet Drive 4 Privet Drive 8 M
KameHouse St 12 KameHouse St 12
.
WITH req1 as (SELECT AA.ad_nomvoie,AA.ad_numero,BB.ad_nomvoie,BB.ad_numero,AA.action
FROM ab.t_adresse as AA
INNER JOIN poma.t_adresse as BB
ON AA.ad_code = BB.ad_code
ORDER BY AA.ad_numero ASC)
UPDATE ab.t_adresse
SET "action" = 'M'
FROM req1
WHERE AA.ad_nomvoie = BB.ad_nomvoie
AND AA.ad_numero == BB.ad_numero
解决方法
据推测,您希望 CTE 加入到正在更新的表中。那将是:
WITH req1 as (
SELECT aa.ad_nomvoie,aa.ad_numero,pa.ad_nomvoie,pa.ad_numero,aa.action
FROM ab.t_adresse aa INNER JOIN
poma.t_adresse pa
ON aa.ad_code = pa.ad_code
)
UPDATE ab.t_adresse a
SET action = 'M'
FROM req1
WHERE a.ad_nomvoie = req1.ad_nomvoie AND
a.ad_numero = req1.ad_numero;
注意:
-
order by
在 CTE 中是多余的。 - 不要用双引号转义标识符。如果你用双引号创建了表,那么重新创建表!它们只会使查询变得混乱。
- 使用有意义的表别名。
pa
是表名的缩写;bb
毫无意义。
我猜 CTE 不是必需的。所以,也许这可以满足您的需求:
UPDATE ab.t_adresse a
SET action = 'M'
FROM poma.t_adresse as pa
WHERE a.ad_code = pa.ad_code;
但是,如果没有示例数据和清晰的逻辑解释,我不能 100% 确定这是等效的。
,我想我有一个解决方案。请检查=>
我的餐桌结构
CREATE TABLE t_adresseAA(ad_code varchar(20),ad_nomvoie varchar(20),ad_numero varchar(20),action varchar(20));
CREATE TABLE t_adresseBB(ad_code varchar(20),action varchar(20));
插入数据
INSERT INTO t_adresseAA VALUES('001','sdfsd','werwer','Action1');
INSERT INTO t_adresseAA VALUES('002','sdfsd111','werwer222','Action2');
INSERT INTO t_adresseAA VALUES('003','Action3');
INSERT INTO t_adresseBB VALUES('001','Action1');
INSERT INTO t_adresseBB VALUES('004','Action2');
INSERT INTO t_adresseBB VALUES('005','Action3');
最终查询
WITH req1 as (SELECT AA.ad_nomvoie ad_nomvoieA,AA.ad_numero ad_numeroA,BB.ad_nomvoie,BB.ad_numero,AA.action
FROM t_adresseAA as AA
INNER JOIN t_adresseBB as BB
ON AA.ad_code = BB.ad_code
)
UPDATE t_adresseAA
SET "action" = 'M'
FROM req1
WHERE req1.ad_nomvoieA = t_adresseAA.ad_nomvoie
AND req1.ad_numeroA = t_adresseAA.ad_numero;
SELECT * FROM t_adresseAA; -- This line is for checking that the data is updated or not.
注意: 代码是用 postgresql v11 编写的。您检查 DB Fiddle
中的代码