Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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 使用多个条件和多行更新_Sql_Db2 - Fatal编程技术网

Sql 使用多个条件和多行更新

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