在 WHERE 子句中使用来自 select 的别名会导致错误:“缺少表的 FROM 子句条目”

问题描述

我是 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

中的代码