ОБНОВЛЕНИЕ нескольких строк с использованием CASE в SQL 2008 - PullRequest
4 голосов
/ 28 февраля 2010

У меня есть следующий оператор SQL, где я пытаюсь обновить несколько строк, соответствующих оператору выбора.

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 относится к типу спецификации, которую я хочу обновить в таблице Cars (1 - размер двигателя)

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

Есть идеи?

Редактировать: Мне нужно обновить несколько столбцов в таблице автомобилей. Вот причина использования 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

Ответы [ 3 ]

3 голосов
/ 28 февраля 2010

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

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

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

1 голос
/ 23 декабря 2011
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.

1 голос
/ 28 февраля 2010

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

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
...