Sql 3表比较以进行更新
DB2UDB11.x 我不确定这为什么如此困难,但在我的更新查询进行了几十次修改之后,我一直无法实现我想要的目标。找到了一堆帖子,但似乎没有一个很有效。以下是我的设想:Sql 3表比较以进行更新,sql,db2,Sql,Db2,DB2UDB11.x 我不确定这为什么如此困难,但在我的更新查询进行了几十次修改之后,我一直无法实现我想要的目标。找到了一堆帖子,但似乎没有一个很有效。以下是我的设想: TABLE1 NAMEPK SIZE AAA 0 BBB 100 CCC 0 DDD 50 TABLE2 NAMEPK COL2 COL3 COL4 AAA 99 99 N BBB 99 99 N CCC 98 99 N DDD 1
TABLE1
NAMEPK SIZE
AAA 0
BBB 100
CCC 0
DDD 50
TABLE2
NAMEPK COL2 COL3 COL4
AAA 99 99 N
BBB 99 99 N
CCC 98 99 N
DDD 100 100 Y <--eliminated because COL4 is Y
TABLE 3
NAMEPK COL2PK COL3PK COL9 SIZE
AAA 99 99 5379 9999 <-- want this because name, col2, col3 match TABLE2 and COL9 set to 5379 and TABLE1.size <> TABLE3.size
AAA 98 99 5379 9988 <--eliminated because COL2 doesnt match TABLE2
AAA 97 99 1000 8989 <--eliminated because COL2 doesnt match TABLE2 and COL9 is not 5379
BBB 99 90 5379 100 <--eliminated because COL3 doesnt match TABLE2
BBB 99 99 5379 100 <--eliminated because TABLE1.size == TABLE3.size
BBB 99 99 5300 9999 <--eliminated because COL9 is not 5379
DDD 100 100 1000 7777 <--eliminated because DDD was eliminated previously since COL4 = Y
所以,它不知道T3.SIZE是什么,因为它在SELECT查询之外?因此,我尝试了其他变体,其中我做了如下操作:
db2 "UPDATE table1 T1 \
SET T1.size = (SELECT T2.size \
FROM table1 T1, table2 T2, table3 T3 \
WHERE T1.namepk = T2.namepk AND \
T2.namepk = T3.namepk AND \
T2.col2 = T3.col2 AND \
T2.col3 = T3.col3 AND \
T2.col4 = 'N' AND \
T3.col9 = 5379 AND \
T1.size <> T3.size)"
无论我怎么努力,我几乎都会犯这两个错误中的一个。感谢您的帮助尝试以下方法:
MERGE INTO TABLE1 T1 USING
(
SELECT T3.NAMEPK, T3.SIZE
FROM TABLE2 T2
JOIN TABLE3 T3 ON T3.NAMEPK = T2.NAMEPK AND T3.COL2PK = T2.COL2 AND T3.COL3PK = T2.COL3
WHERE T2.COL4 = 'N' AND T3.COL9 = 5379
) T23 ON T23.NAMEPK = T1.NAMEPK AND T23.SIZE <> T1.SIZE
WHEN MATCHED THEN UPDATE SET SIZE = T23.SIZE;
如果T23对同一个名称pk有多行,且大小不等于TABLE1.SIZE,则语句失败。Mark,您太棒了!这非常有效。我需要记住这一点…我尝试了一系列合并stmt,但没有得到正确的组合。非常感谢
db2 "UPDATE table1 T1 SET T1.size = T3.size \
WHERE namepk \
IN (SELECT T1.namepk, T3.size
FROM table1 T1, table1 T2, table3 T3 \
WHERE T1.namepk = T2.namepk AND \
T2.namepk = T3.namepk AND \
T2.col2 = T3.col2 AND \
T2.col3 = T3.col3 AND \
T2.col4 = 'N' AND \
T3.col9 = 5379 AND \
T1.size <> T3.size)"
SQL0206N "T3.SIZE" is not valid in the context where it is used.
db2 "UPDATE table1 T1 \
SET T1.size = (SELECT T2.size \
FROM table1 T1, table2 T2, table3 T3 \
WHERE T1.namepk = T2.namepk AND \
T2.namepk = T3.namepk AND \
T2.col2 = T3.col2 AND \
T2.col3 = T3.col3 AND \
T2.col4 = 'N' AND \
T3.col9 = 5379 AND \
T1.size <> T3.size)"
SQL0811N The result of a scalar fullselect, SELECT INTO statement, or VALUES
INTO statement is more than one row.
MERGE INTO TABLE1 T1 USING
(
SELECT T3.NAMEPK, T3.SIZE
FROM TABLE2 T2
JOIN TABLE3 T3 ON T3.NAMEPK = T2.NAMEPK AND T3.COL2PK = T2.COL2 AND T3.COL3PK = T2.COL3
WHERE T2.COL4 = 'N' AND T3.COL9 = 5379
) T23 ON T23.NAMEPK = T1.NAMEPK AND T23.SIZE <> T1.SIZE
WHEN MATCHED THEN UPDATE SET SIZE = T23.SIZE;