Sql 使用多个条件和多行更新
我希望能够使用一个update语句更新一个表,但在其中包含各种条件。下面的代码包含一个表test\u table,该表保存主id,主id可以有产品和客户的案例id。我希望能够检查表CASETABLE,如果存在与main_id相关的“PC”案例或“CC”案例,则更新相应字段Sql 使用多个条件和多行更新,sql,db2,Sql,Db2,我希望能够使用一个update语句更新一个表,但在其中包含各种条件。下面的代码包含一个表test\u table,该表保存主id,主id可以有产品和客户的案例id。我希望能够检查表CASETABLE,如果存在与main_id相关的“PC”案例或“CC”案例,则更新相应字段 UPDATE test_table tt SET tt.product_case = CASE WHEN ct.TYPE = 'PC' THEN ct.ID ELSE tt_.product_case EN
UPDATE
test_table tt
SET
tt.product_case = CASE WHEN ct.TYPE = 'PC' THEN ct.ID ELSE tt_.product_case END,
tt.customer_case = CASE WHEN ct.TYPE = 'CC' THEN ct.ID ELSE tt.customer_case END
FROM
CASETABLE ct
WHERE
ct.STATUS = 'ACTIVE'
AND ct.MAINRECORD = tt.main_id
显然,如果main WHERE返回2行,则这不起作用,因为每种情况都会尝试设置正确的值,然后再次设置其原始值,从而导致SQL错误21506(尝试为同一行设置多次)。如果不使用两个单独的UPDATE语句,我如何做到这一点?您可以在下面尝试-
UPDATE test_table tt
SET tt.product_case =
(SELECT CASE WHEN ct.TYPE = 'PC' THEN ct.ID ELSE tt_.product_case END
FROM CASETABLE ct WHERE ct.MAINRECORD = tt.main_id),
tt.customer_case=(SELECT CASE WHEN ct.TYPE = 'CC' THEN ct.ID ELSE tt_.product_case END
FROM CASETABLE ct WHERE ct.MAINRECORD = tt.main_id)
WHERE EXISTS(
SELECT 1
FROM CASETABLE ct
WHERE ct.MAINRECORD = tt.main_id and STATUS = 'ACTIVE')
请试试这个
UPDATE
tt
SET
tt.product_case = CASE WHEN ct.TYPE = 'PC' THEN ct.ID ELSE tt_.product_case END,
tt.customer_case = CASE WHEN ct.TYPE = 'CC' THEN ct.ID ELSE tt.customer_case END
FROM
test_table tt
INNER JOIN CASETABLE ct
ON ct.MAINRECORD = tt.main_id
WHERE
ct.STATUS = 'ACTIVE'
使用具有条件聚合的子查询:
UPDATE test_table tt
SET tt.product_case = COALESCE(ct.pc, tt.product_case),
tt.customer_case = COALESCE(ct.cc, tt.customer_case)
FROM (SELECT ct.MAINRECORD,
MAX(CASE WHEN ct.TYPE = 'PC' THEN ct.ID END) as pc,
MAX(CASE WHEN ct.TYPE = 'CC' THEN ct.ID END) as cc
FROM CASETABLE ct
WHERE ct.STATUS = 'ACTIVE'
GROUP BY ct.MAINRECORD
) ct
WHERE ct.MAINRECORD = tt.main_id ND
(ct.pc is not null or ct.cc is not null);