2010-02-28 4 views
4

У меня есть следующий оператор SQL, в котором я пытаюсь обновить несколько строк, соответствующих выражению select.UPDATE Несколько строк с использованием CASE в SQL 2008

UPDATE Cars 
SET engineSize = CASE specCode WHEN 1 THEN value ELSE engineSize END 
FROM Cars 
INNER JOIN CarSpecs ON CarsSpecs.carID = Cars.carID 

Мои таблицы следующим образом:

Cars 

carID engineSize ... 
1  0 
2  0 

CarSpecs 

carID specCode value 
1  1   1800 
1  2   Blue 
1  3   Petrol 
2  1   2200 
2  2   Green 
2  3   Petrol 

specCode относится к типу спецификации Я хочу, чтобы обновить в таблице Автомобили (1 является объем двигателя)

Когда я бегу запрос возвращает NULL каждый раз. Как я вижу, он должен найти specCode = 1 и установить engineSize в 1800, после того как он будет установлен, он просто устанавливает его в первое найденное значение.

Любые идеи?

Редактировать: Мне нужно обновить несколько столбцов в таблице Cars. Это причина для использования CASE, а именно:

UPDATE Cars 
SET engineSize = CASE specCode WHEN 1 THEN value ELSE engineSize END, 
colour = CASE specCode WHEN 2 THEN value ELSE colour END 
FROM Cars 
INNER JOIN CarSpecs ON CarsSpecs.carID = Cars.carID 
+0

, когда вы говорите «он возвращается в нуль», вы имеете в виду, что поле размера двигателя установлено равным нулю для всех записей? Будете ли вы иметь записи для каждого carID, где specCode = 1 в таблице спецификаций? – Ray

ответ

3

Чтобы обновить несколько столбцов, в вашем случае вам необходимо иметь несколько объединений (как нарисованная Martin)

UPDATE Cars 
SET engineSize = CarSpecs1.value, colour = CarSpecs2.value 
FROM Cars 
INNER JOIN CarSpecs CarSpecs1 
    ON CarsSpecs1.carID = Cars.carID AND CarsSpecs1.specCode =1 
INNER JOIN CarSpecs CarSpecs2 
    ON CarsSpecs2.carID = Cars.carID AND CarsSpecs2.specCode =2 

Использование внешних соединений из не хранится каждый спецификации для каждого автомобиля.

+0

Хороший, не так ли! – AxelEckenberger

+0

Да. Более прямо вперед, чем предложение PIVOT, которое я только что сделал. –

+0

Это выполнит эту работу, однако мне нужно обновить 20 столбцов до 10 000 автомобилей, поэтому я не могу не чувствовать, что LEFT-соединения замедлят это. Нет ли способа сделать это с помощью операторов CASE? – markvpc

1

В случае, если решение Мартина не работает (при запуске в три раза), вы могли бы сделать это и сразу ... хотя немного больше arkward:

UPDATE Cars 
SET Cars.engineSize = (SELECT value FROM CarSpecs WHERE CarSpecs.carId = Cars.carID AND CarSpecs.specCode = 1), 
SET Cars.colour = (SELECT value FROM CarSpecs WHERE CarSpecs.carId = Cars.carID AND CarSpecs.specCode = 2), 
SET Cars.fuel = (SELECT value FROM CarSpecs WHERE CarSpecs.carId = Cars.carID AND CarSpecs.specCode = 3) 
FROM Cars 
1
UPDATE empsal SET sal = 
    CASE WHEN sal BETWEEN 100 AND 500 THEN sal + 400 
    WHEN sal BETWEEN 1000 AND 2000 THEN sal + 1000 
    else sal 
    END 

ELSE часть не обязательно. Но если его нет, все случаи, не оцененные, будут заменены на NULL.