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