ОБНОВЛЕНИЕ с несколькими критериями и несколькими строками - PullRequest
3 голосов
/ 05 марта 2019

Я хотел бы иметь возможность обновлять таблицу с помощью одного оператора UPDATE, но включать в нее различные критерии. Следующий код содержит таблицу test_table, которая содержит main_id, который может иметь идентификаторы product_case и customer_case. Я хотел бы иметь возможность проверить таблицу CASETABLE, и если есть случай «ПК» или «CC», связанный с main_id, то обновите соответствующие поля.

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

Очевидно, что это не сработает, если основной WHERE возвращает 2 строки, поскольку каждый случай будет пытаться установить правильное значение, а затем снова установить свое исходное значение, вызывая ошибку SQL 21506 (пытаясь установить более одного раза для одной и той же строки). Как я могу сделать это, не используя только два отдельных оператора UPDATE?

Ответы [ 3 ]

2 голосов
/ 05 марта 2019

Пожалуйста, попробуйте это

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'
0 голосов
/ 05 марта 2019

Использовать подзапрос с условным агрегированием:

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);
0 голосов
/ 05 марта 2019

Вы можете попробовать ниже -

   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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...