2017-02-24 11 views
1

これが可能かどうかわかりませんが、私がしようとしていることの本質は2つの別々のSELECTSを持っています。 2つの結果の結合のために。注:{brackets}のテキストは単なる一般的な置換に過ぎません。下記の私にCASEで構文エラーを与える:UPDATEクエリでSELECTの前にFROMの後にCASE文を使用する方法

UPDATE MySchema.MyTable as MyTable 
SET {column_names} = {new values} 
FROM 
CASE 
    WHEN {case A} THEN 
     (SELECT {column_names} 
     FROM MySchema.MyOtherTable 
     WHERE {conditions} 
     LIMIT 1) 
    ELSE 
     ((SELECT {column_names} 
     FROM MySchema.MyOtherTable 
     WHERE {conditions} 
     LIMIT 1) 
     UNION 
     (SELECT {column_names} 
     FROM MySchema.MyOtherTable 
     WHERE {other_conditions} 
     LIMIT 1)) 
END CASE; 
AS MyOtherTable 
WHERE MyTable.product_id = MyOtherTable.product_id 

私はUPDATEでの作業このクエリを持っていた - SET - 2例それぞれの内側に重複FROM部分が、私は中に冗長性をトリミングしようとしています可能であればクエリ。私もそれぞれのケースの中でFROMを動かしてみましたが、それも構文エラーを出しました。

答えて

1

case式を使用して、ステートメントで使用されるオブジェクトをまとめることはできません。ただし、{case A}が発生していない場合{other_conditions}と値のみを使用しているので、この構造をエミュレートするために、論理演算子を使用することができます。

UPDATE MySchema.MyTable as MyTable 
SET {column_names} = {new values} 
FROM 
((SELECT {column_names} 
FROM MySchema.MyOtherTable 
WHERE {conditions} 
LIMIT 1) 
UNION 
(SELECT {column_names} 
FROM MySchema.MyOtherTable 
WHERE (NOT ({case A})) AND ({other_conditions}) -- Here! 
LIMIT 1)) 
+1

はい、私は似たような考えられのです。これはトリガー関数の内部にあり、ケースAは、値が 'OLD'でNULLであるか、 'NEW'と 'OLD'で同じである場合です。更新は単一の行または同じ行と別の行を固定するためです。私はunion selectを含むだけでオーバーヘッドが大きくなるのではないかと懸念していましたが、私は 'NOT {case A} 'ロジックを考慮していませんでした。ありがとう! –

関連する問題