4

select ステートメントに一致する複数の行を更新しようとしている次の 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 に設定し、設定後、最初に見つかった値に設定するだけです。

何か案は?

編集: 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
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 に答える
1

マーティンのソリューションが機能しない場合 (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 に答える