Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 3表比较以进行更新_Sql_Db2 - Fatal编程技术网

Sql 3表比较以进行更新

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

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    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;