2016-11-22 3 views
1

Я рассмотрел вопрос, который касается обновления нескольких записей в одном запросе.SQL - Обновление нескольких записей в одном запросе с помощью Composite Key

Общее решение

UPDATE table_name 
SET field_to_update = CASE table_key 
        WHEN key_value1 THEN field_value1 
        WHEN key_value2 THEN feild_value2 
        ELSE feild_to_update 
        END 
WHERE table_key IN(key_value1 , key_value2); 

Мой вопрос в том, кто это может быть адаптирована для удовлетворения составного ключа. Скажем, если у меня есть столбцы

(id_1, id_2, column_to_update) 

где id_1 и id_2 образуют составной первичный ключ.

Моя проблема упрощается из-за того, что один из столбцов id будет постоянным для конкретного запроса.

Например, мне нужно что-то вдоль линий

UPDATE table_name 
SET field_to_update = CASE (key1, key2) 
       WHEN (1,1) THEN field_value1 
       WHEN (2,1) THEN feild_value2 
       ELSE feild_to_update 
       END 
WHERE (key1, key2) IN ((1, 1) , (2, 1)); 

Может кто-нибудь помочь, пожалуйста?

+0

случае допускают только на операнд, если использовать кортеж, как в вашем случае у вас есть ошибка «операнд должен содержать 1 столбец (ы)», потому что есть 2 операнда – scaisEdge

+0

Да, я знаю, но я просто хотел понять, что я хочу сделать. Даже это требует совершенно другого синтаксиса, я не против. –

+0

Существует альтернативная форма 'CASE'; 'CASE WHEN [состояние] THEN [blah] WHEN [состояние2] THEN [blah2] .... ELSE .... END'. – Uueerdo

ответ

1

Использование кортежа в случае не допускаются случай допускается только один операнд, если вы используете кортеж, как в вашем случае у вас есть ошибка «Операнд должен содержать 1 столбец (ы)», потому что 2 операндов

но вы можете переопределить с некоторой манипуляции, например, в CONCAT (и неявного преобразования)

UPDATE table_name 
    SET field_to_update = CASE concat(key1, key2) 
       WHEN concat(1,1) THEN field_value1 
       WHEN concat(2,1) THEN feild_value2 
       ELSE feild_to_update 
       END 
    WHERE concat(key1, key2) IN (concat(1, 1) , concat(2, 1)); 
+0

Идеальное решение. спасибо –

+0

@ConnorBishop. спасибо за правильную манипуляцию, чтобы избежать ложных срабатываний (два разных значения, которые присоединились к ним) – scaisEdge

+0

@scaisEdge хороший способ сделать это, как правило, просто добавляет маловероятную строку между двумя значениями; например, в случае чисел 'CASE CONCAT (key1, '|', key2) WHEN '1 | 1' THEN ...' – Uueerdo