请求:更新或插入来自相同 table 的行
Request: Update or Insert rows from the same table
我使用 db2 SQL 数据库并完成了以下任务:这个方案 XXWWF590 中包含 table XXWWC5。 table 本身包含不同的列,例如送货号码、送货地址,如姓名、街道、邮政编码等。还有一个叫production site的栏目,里面不同的site有不同的数字(比如公司1是100,公司2是200等)
这就是它变得棘手的地方:我被要求将编号为 500 的 "production site" 列中的所有条目复制到生产站点 600 的行,如果它们已经存在,则应将它们覆盖,如果不存在,则插入- 我不知道我该怎么做。
以下是 table 的摘录,以便您更好地理解我的意思:
--------------------------------------------------
| | (ColA) - Site | (ColB)Del.Adress |
--------------------------------------------------
| Row1 | (CellA1) 500 | (CellB1) Berlin |
--------------------------------------------------
| Row2 | (CellA2) 500 | (CellB2) Munich |
--------------------------------------------------
| Row3 | (CellA3) 600 | (CellB3) Berlin |
--------------------------------------------------
还有更多的列和行,它们也不叫"Site"或收货地址,而是有一个神秘的名字,比如C5BSTX,但这在这种情况下并不重要。请在查看我的陈述时记住这一点。
因为要求覆盖和插入。我想出了合并 table 的想法,所以我尝试了,但从未完成声明,只是因为我认为我无法将来自一个 table 的数据合并到同一个 table .尽管如此;这是我到目前为止写的:
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
这最终让我尝试插入数据,但老实说,我的脑袋在转来转去,我确实需要帮助。
正如我在评论中所说,您的合并声明几乎是正确的。下面是一个可以完成这项工作的人
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'
)
我使用 db2 SQL 数据库并完成了以下任务:这个方案 XXWWF590 中包含 table XXWWC5。 table 本身包含不同的列,例如送货号码、送货地址,如姓名、街道、邮政编码等。还有一个叫production site的栏目,里面不同的site有不同的数字(比如公司1是100,公司2是200等) 这就是它变得棘手的地方:我被要求将编号为 500 的 "production site" 列中的所有条目复制到生产站点 600 的行,如果它们已经存在,则应将它们覆盖,如果不存在,则插入- 我不知道我该怎么做。
以下是 table 的摘录,以便您更好地理解我的意思:
--------------------------------------------------
| | (ColA) - Site | (ColB)Del.Adress |
--------------------------------------------------
| Row1 | (CellA1) 500 | (CellB1) Berlin |
--------------------------------------------------
| Row2 | (CellA2) 500 | (CellB2) Munich |
--------------------------------------------------
| Row3 | (CellA3) 600 | (CellB3) Berlin |
--------------------------------------------------
还有更多的列和行,它们也不叫"Site"或收货地址,而是有一个神秘的名字,比如C5BSTX,但这在这种情况下并不重要。请在查看我的陈述时记住这一点。
因为要求覆盖和插入。我想出了合并 table 的想法,所以我尝试了,但从未完成声明,只是因为我认为我无法将来自一个 table 的数据合并到同一个 table .尽管如此;这是我到目前为止写的:
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
这最终让我尝试插入数据,但老实说,我的脑袋在转来转去,我确实需要帮助。
正如我在评论中所说,您的合并声明几乎是正确的。下面是一个可以完成这项工作的人
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'
)