【问题标题】:UPDATE statement with multiple joins to main table in PostgreSQL在 PostgreSQL 中具有多个连接到主表的 UPDATE 语句
【发布时间】:2019-02-23 03:46:41
【问题描述】:

我正在做从 mysql 到 postgres 的对话。

我尝试使用连接表 EUTMPDFH T1 和 EUTMPTBLDT T2 更新表 EUTMPDFHDT T。

这是我在 mysql 中使用的代码。

UPDATE EUTMPDFHDT
SET NWCOLID=T2.NWCOLID
FROM EUTMPDFHDT T
INNER JOIN EUTMPDFH T1 ON T.DFHID = T1.DFHID AND T1.DFHTYP IN ('D','U','S','P','B')
INNER JOIN EUTMPTBLDT T2 ON T.COLID = T2.COLID

在 postgres 中,我确实尝试过关注 UPDATE statement with multiple joins in PostgreSQL

但无济于事我无法解决它,因为更新语句不一样。

我在 postgres 中做了什么:

UPDATE EUTMPDFHDT AS T
SET NWCOLID=T2.NWCOLID
FROM 
EUTMPDFH T1
JOIN EUTMPTBLDT T2 ON T.COLID = T2.COLID
WHERE T.DFHID = T1.DFHID AND T1.DFHTYP IN ('D','U','S','P','B');

这是我遇到的错误

ERROR:  invalid reference to FROM-clause entry for table "t"
LINE 5:  JOIN EUTMPTBLDT T2 ON T.COLID = T2.COLID
                               ^
HINT:  There is an entry for table "t", but it cannot be referenced from this part of the query.
QUERY:  UPDATE EUTMPDFHDT AS T
    SET NWCOLID=T2.NWCOLID
    FROM 
    EUTMPDFH T1
    JOIN EUTMPTBLDT T2 ON T.COLID = T2.COLID
    WHERE T.DFHID = T1.DFHID AND T1.DFHTYP IN ('D','U','S','P','B')

【问题讨论】:

    标签: sql postgresql sql-update inner-join


    【解决方案1】:

    正如in the manual 所述,您应该在 UPDATE 语句的 FROM 子句中重复目标表。

    不幸的是,UPDATE 的 FROM 子句不遵循与 SELECT 子句中使用的完全相同的规则。使用旧的隐式连接而不是(通常首选的)显式 JOIN 运算符更容易。

    据我所知,这就是你要找的东西:

    UPDATE eutmpdfhdt as t
      SET nwcolid = t2.nwcolid
    FROM eutmpdfh t1, 
         eutmptbldt t2 
    WHERE t.dfhid = t1.dfhid 
      AND t.colid = t2.colid  
      AND t1.dfhtyp IN ('D','U','S','P','B')
    

    【讨论】:

    • 奇怪的是,只有隐式连接才能导致无错误的更新。我从未在其他 SQL 语言中遇到过这种情况。
    【解决方案2】:

    您不能在 ON 子句中包含要更新的表中的列。它必须在 WHERE 中。如果您像这样修改代码,我相信它会为您提供所需的结果:

    UPDATE
        EUTMPDFHDT AS T
    SET
        NWCOLID = T2.NWCOLID
    FROM
        EUTMPTBLDT T2
    WHERE
        T.COLID = T2.COLID AND
        EXISTS (SELECT 1 FROM EUTMPDFH WHERE DFHID = t.DFHID AND DFHTYP IN ('D','U','S','P','B'));
    

    【讨论】:

      【解决方案3】:

      您不能在更新查询中从 ON 子句引用 FROm 表的列。您可以按如下方式更改查询

      UPDATE EUTMPDFHDT AS T
      SET NWCOLID=Q.NWCOLID
      FROM (SELECT T2.NWCOLID, T.DFHID 
      FROM EUTMPDFHDT AS T
      JOIN EUTMPDFH T1 ON  T.DFHID = T1.DFHID 
      JOIN EUTMPTBLDT T2 ON T.COLID = T2.COLID
      WHERE T1.DFHTYP IN ('D','U','S','P','B'))Q
      WHERE Q.DFHID=T.DFHID
      

      【讨论】:

        猜你喜欢
        • 2015-11-29
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 2012-03-02
        • 1970-01-01
        相关资源
        最近更新 更多