【问题标题】:Update using left join in netezza在 netezza 中使用左连接更新
【发布时间】:2015-05-25 11:47:05
【问题描述】:
我需要在更新期间对 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
这就像尝试更新多个列。
谢谢,
马尼拉蒂南。
【问题讨论】:
标签:
left-join
insert-update
netezza
【解决方案1】:
在 Netezza 中使用连接执行 UPDATE TABLE 时,重要的是要了解正在更新的表总是与 FROM 列表隐式地 INNER JOIN。这种行为是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)