我需要在更新期间对 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 中执行带有联接的 UPDATE TABLE 时,重要的是要了解正在更新的表是always与 FROM 列表隐式 INNER JOIN。这种行为是记录在这里 http://www-01.ibm.com/support/knowledgecenter/SSULQD_7.2.0/com.ibm.nz.dbu.doc/r_dbuser_update.html.
您的代码实际上是将 table_1 连接到自身(一份没有别名的副本,一份以 t1 作为别名)。由于 table_1 的这两个版本之间没有联接条件,因此您将获得一个交叉联接,该联接提供了尝试更新 table_1 的多行。
使用 OUTER join 处理 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)