在 netezza 中使用左连接更新

Update using left join in netezza

我需要在更新期间对 netezza 中的两个表执行左连接。我怎样才能做到这一点?与三个表的左连接有效,但对两个表无效。

UPDATE table_1
SET c2 = t2.c2
FROM
    table_1 t1
    LEFT JOIN table_2.t1
    ON t1.c1=t2.c1
    LEFT JOIN table_3 t3
    ON t2.c1=t3.c1

这可行,但

UPDATE table_1
SET c2 = t2.c2
FROM table_1 t1
    LEFT JOIN table_2.t1
    ON t1.c1=t2.c1

这表示尝试更新多列。

谢谢, 马尼拉提南

在 Netezza 中执行带有连接的更新 TABLE 时,重要的是要了解正在更新的 table 总是 隐式与来自列表。此行为是 documented here.

您的代码实际上是将 table_1 连接到自身(一份没有别名,一份以 t1 作为别名)。由于 table_1 的这两个版本之间没有连接条件,您将获得一个交叉连接,它提供了多个尝试更新 table_1.

的行

处理带有 OUTER 连接的 UPDATE 的最佳方法是使用这样的子选择:

TESTDB.ADMIN(ADMIN)=> select * from table_1 order by c1;
 C1 | C2
----+----
  1 |  1
  2 |  2
  3 |  3
(3 rows)

TESTDB.ADMIN(ADMIN)=> select * from table_2 order by c1;
 C1 | C2
----+----
  1 | 10
  3 | 30
(2 rows)


TESTDB.ADMIN(ADMIN)=> UPDATE table_1 t1
SET t1.c2 = foo.c2
FROM (
      SELECT t1a.c1,
         t2.c2
      FROM table_1 t1a
         LEFT JOIN table_2 t2
         ON t1a.c1 = t2.c1
   )
   foo
WHERE t1.c1 = foo.c1;
UPDATE 3

TESTDB.ADMIN(ADMIN)=> select * from table_1 order by c1;
 C1 | C2
----+----
  1 | 10
  2 |
  3 | 30
(3 rows)