请求:更新或插入同一个表中的行

时间:2015-04-08 08:50:35

标签: sql insert merge db2

我使用db2 SQL数据库并完成以下任务:此方案XXWWF590中包含表XXWWC5。表本身包含不同的列,例如送货号码,送货地址,如姓名,街道,邮政编码等。还有一个名为生产站点的列,其中包含不同站点的不同编号(如公司1为100,公司2为200等) 这是棘手的问题:我被要求将数字500的“生产站点”列中的所有条目复制到生产站点600的行,如果它们已经存在,则它们将被覆盖,如果没有,则插入 - 而且我不知道我该怎么做。

以下是该表的摘录,以便您可以更好地想象我的意思:

--------------------------------------------------
|           | (ColA) - Site   | (ColB)Del.Adress |
--------------------------------------------------
| Row1      | (CellA1) 500    | (CellB1) Berlin  |
--------------------------------------------------
| Row2      | (CellA2) 500    | (CellB2) Munich  |
--------------------------------------------------
| Row3      | (CellA3) 600    | (CellB3) Berlin  |
--------------------------------------------------

还有更多的列和行,它们也不称为“站点”或传递地址,但具有隐藏的名称,如C5BSTX,但在这种情况下无关紧要。当你看一下我的陈述时,请记住这一点。

由于要求覆盖以及插入。我提出了合并表的想法,所以我尝试了,但从未完成语句,只是因为我认为我无法将一个表中的数据合并到同一个表中。尽管如此;这是我到目前为止所写的内容:

MERGE INTO WWC5REP AS a
USING (SELECT C5ATCD, C5BSTX, C5BTTX, C5BVTX, C5OXT1, C5BXTX, C5TETY
WHERE C5ENCD = '500') AS a_tmp
FROM WWC5REP
ON a.C5ATCD = a_tmp.C5ATCD
WHEN MATCHED THEN 
UPDATE SET
( a.C5BSTX = a_tmp.C5BSTX
, a.C5BTTX = a_tmp.C5BTTX
, a.C5BUTX = a_tmp.C5BUTX
, a.C5BVTX = a_tmp.C5BVTX
, a.C5OXT1 = a_tmp.C5OXT1
, a.C5HTTX = a_tmp.C5HTTX
, a.C5BXTX = a_tmp.C5BXTX
, a.C5TETY = a_tmp.C5TETY
, a.C5AAST = '0'
, a.C5ABDT = 11500407
, a.C5AATM = 101500
, a.C5DBCD = '99222'
)
WHEN NOT MATCHED THEN
INSERT
( a.C5BSTX
, a.C5BTTX
, a.C5BUTX
, a.C5BVTX
, a.C5OXT1
, a.C5HTTX
, a.C5BXTX
, a.C5TETY
, a.C5AAST
, a.C5ABDT
, a.C5AATM
, a.C5DBCD
)
VALUES
( a_tmp.C5BSTX
, a_tmp.C5BTTX
, a_tmp.C5BUTX
, a_tmp.C5BVTX
, a_tmp.C5OXT1
, a_tmp.C5HTTX
, a_tmp.C5BXTX
, a_tmp.C5TETY
, '0'              
, 1150402                                                           
, 101500
, '99222'
)       

在我看来,C5ATCD列是主键,因为两个站点(500和600)在该列中具有相同的值。

我想到的下一件事是更新,但这确实和合并一样好。

UPDATE WWC5REP AS a
SET a.C5BSTX = b.C5BSTX, a.C5BTTX = b.C5BTTX, a.C5BUTX = b.C5BUTX,
    a.C5BVTX = b.C5BVTX, a.C5OXT1 = b.C5OXT1, a.C5HTTX = b.C5HTTX,
    a.C5BXTX = b.C5BXTX, a.C5TETY = b.C5TETY, a.C5AAST = '0', a.C5ABDT = 1150401, 
    a.C5AATM = 101500, a.C5DBCD = '99222' 
FROM WWC5REP AS b
WHERE a.C5ENCD IN ('600') 
AND b.C5ENCD IN ('600')
ON a.C5ATCD = b.C5ATCD

最终导致我尝试插入数据,但老实说,我的头脑是旋转的,我肯定需要帮助。

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说,你的合并声明几乎是正确的。以下是将完成工作的那个

MERGE INTO WWC5REP AS a
USING (SELECT '600' as C5ATCD, C5BSTX, C5BTTX, C5BVTX, C5OXT1, C5BXTX, C5TETY
FROM WWC5REP
WHERE C5ENCD = '500') AS a_tmp
ON a.C5ATCD = a_tmp.C5ATCD
WHEN MATCHED THEN 
UPDATE SET
  a.C5BSTX = a_tmp.C5BSTX
, a.C5BTTX = a_tmp.C5BTTX
, a.C5BUTX = a_tmp.C5BUTX
, a.C5BVTX = a_tmp.C5BVTX
, a.C5OXT1 = a_tmp.C5OXT1
, a.C5HTTX = a_tmp.C5HTTX
, a.C5BXTX = a_tmp.C5BXTX
, a.C5TETY = a_tmp.C5TETY
, a.C5AAST = '0'
, a.C5ABDT = 11500407
, a.C5AATM = 101500
, a.C5DBCD = '99222'
)
WHEN NOT MATCHED THEN
INSERT
( a.C5ATCD
, a.C5BSTX
, a.C5BTTX
, a.C5BUTX
, a.C5BVTX
, a.C5OXT1
, a.C5HTTX
, a.C5BXTX
, a.C5TETY
, a.C5AAST
, a.C5ABDT
, a.C5AATM
, a.C5DBCD
)
VALUES
( a_tmp.C5ATCD
, a_tmp.C5BSTX
, a_tmp.C5BTTX
, a_tmp.C5BUTX
, a_tmp.C5BVTX
, a_tmp.C5OXT1
, a_tmp.C5HTTX
, a_tmp.C5BXTX
, a_tmp.C5TETY
, '0'              
, 1150402                                                           
, 101500
, '99222'
)       
相关问题