4

我有以下 SQL 语句,我正在尝试更新与 select 语句匹配的多行。

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 ,然后在设置之后将其设置为第一个找到的值。

有任何想法吗?

编辑:我需要更新 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
4

3 回答 3

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

使用并非为每辆车存储每个规格的 OUTER 连接。

于 2010-02-28T14:34:48.627 回答
1

如果 Martin 的解决方案不起作用(当它运行 3 次时),您也可以立即执行此操作......虽然有点尴尬:

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
于 2010-02-28T14:35:21.207 回答
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。

于 2011-12-23T07:32:05.337 回答