2011-02-04 12 views
2

私は次のクエリを持っており、total1でtable1を更新しようとしています。 これを1ステップで実行する方法はありますか?ジョインとグループによる括弧でクエリを更新

select e.id 
    , p.id 
    , case 
     when count(distinct e.item) = 1 then 100 
     when count(distinct e.item) = 2 then 150 
     when count(distinct e.item) = 3 then 200 
     when count(distinct e.item) = 4 then 225 
     when count(distinct e.item) = 5 then 275 
     when count(distinct e.item) = 6 then 325 
     when count(distinct e.item) = 7 then 375 
     when count(distinct e.item) = 8 then 450 
     when count(distinct e.item) = 8 then 470 
     end as TotalPay 
    from table1 p 
    join table2 e on e.id = '111111' 
       and p.id=e.itemid 
group by e.id, p.id 

答えて

3

使用:句が必要です

UPDATE TABLE1 
    SET total = (SELECT CASE 
         WHEN COUNT(DISTINCT t2.item) = 1 THEN 100 
         WHEN COUNT(DISTINCT t2.item) = 2 THEN 150 
         WHEN COUNT(DISTINCT t2.item) = 3 THEN 200 
         WHEN COUNT(DISTINCT t2.item) = 4 THEN 225 
         WHEN COUNT(DISTINCT t2.item) = 5 THEN 275 
         WHEN COUNT(DISTINCT t2.item) = 6 THEN 325 
         WHEN COUNT(DISTINCT t2.item) = 7 THEN 375 
         WHEN COUNT(DISTINCT t2.item) = 8 THEN 450 
         WHEN COUNT(DISTINCT t2.item) = 9 THEN 470 
         END 
        FROM TABLE2 t2 
       WHERE t2.itemid = id 
        AND t2.id = '111111' 
       GROUP BY t2.id, t2.itemid) 
WHERE EXISTS(SELECT NULL 
       FROM TABLE2 t 
       WHERE t.itemid = id 
       AND t.id = '111111') 
  • ザ・、そうでない場合は、すべてのTABLE1の行が処理されます。関連するTABLE2行を持たない人は、NULL
  • に更新されました.SQL()のようなUPDATE句のJOINは、Oracle(IME、最大10g)はサポートしていません。SQL Server - サブクエリを使用する必要があります(この例では相関しています)。また、更新されているテーブルのテーブルエイリアスを定義することもできないため、この例のようにテーブルエイリアスを省略した場合、エイリアスを持たないテーブルからカラムが来ています(更新されるもの)
+0

EXISTSの下のsubselectでは、WHERE句の 'id'に' TABLE1'という接頭辞を付けるべきではありませんか?そして、他の副選択のために。 –

+0

@Andriy M:可能ですが、オプティマイザが、テーブルエイリアスを持たない列参照が適切に関連付けられているとの回答が既に説明されています。 –

+0

私はそのビットを見落としました、私には恥です。ごめんなさい。 –

1

試してみてください - それはNULLに列を設定しますする

update table1 p 
set TotalPay = 
(
select case 
     when count(distinct e.item) = 1 then 100 
     when count(distinct e.item) = 2 then 150 
     when count(distinct e.item) = 3 then 200 
     when count(distinct e.item) = 4 then 225 
     when count(distinct e.item) = 5 then 275 
     when count(distinct e.item) = 6 then 325 
     when count(distinct e.item) = 7 then 375 
     when count(distinct e.item) = 8 then 450 
     when count(distinct e.item) = 8 then 470 
     end as TotalPay 
    from table2 e where p.id=e.itemid 
       and e.id = '111111' 
) 

以上、コメントで指摘したようには、table2の中に一致がない場合でも、TABLE1のすべての行を更新します。 WHERE句を追加しないようにするには - OMGPoniesの答えを参照してください。

+1

一致する 'e.itemid'レコードがないときは、NULLを書きませんか? –

+0

@OMG Ponies、はいそれは – Ronnis

+0

@OMG Ponyies、あなたがnullvsで上書きの非常に問題の悪い思い出から回復したらあなたのupvoteを持っています:) – Ronnis

関連する問題