我需要在更新期间在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。
答案 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)