在netezza中使用左连接进行更新

时间:2015-03-22 12:04:07

标签: left-join insert-update 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

这就像尝试更新多个列一样。

谢谢, Manirathinam。

1 个答案:

答案 0 :(得分:1)

在Netezza中执行带有连接的UPDATE TABLE时,了解正在更新的表总是隐式地使用FROM列表进行INNER连接非常重要。此行为是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)