« MP不足日記 | Home | 寝坊の季節 »

2006年12月11日

複数列副問合せ

複数列副問合せは、使いたい時に構文を忘れていて無駄な時間を
使うことが多いです。

面倒になって複数の主キーを文字列結合して無理やり
単一列の副問合せで処理しようとしたりする(笑


・事業所毎売上テーブルの売上合計が10円以上の事業所は、事業所マスタのランクにSをセット
・事業所マスタと事業所毎売上テーブルの主キーは会社コード、事業所コードとする
・DBはOracle(10g)

UPDATE
  事業所マスタ
SET
  ランク = 'S'
WHERE
  (会社コード,事業所コード) IN 
  (
    SELECT
      会社コード,事業所コード
    FROM
      事業所毎売上テーブル
    WHERE
      売上合計 >= 10
  )

コメントでikkanくんが「EXISTSとか使えそうな気がする」とのことだったので、
EXISTS版も

UPDATE
  事業所マスタ
SET
  ランク = 'S'
WHERE EXISTS
  (
    SELECT
      *
    FROM
      事業所毎売上テーブル
    WHERE
          事業所マスタ.会社コード = 事業所毎売上テーブル.会社コード(+)
      AND 事業所マスタ.事業所コード = 事業所毎売上テーブル.事業所コード(+)
      AND 売上合計 >= 10
  )

ざっと見た限りでは速度やメモリ等のコストの差はなさそうな気がしました。

コメント(4)

EXISTSとか使えそうな気がする…(テキトー

おお。明日試してみます!

ありゃ、変わんないのかー。
INよりEXISTSのほうが速いと思ってた。
Oracleは賢いから変わらないのかな。
ちなみにEXISTS以下のSELECT文は"SELECT * FROM"でいいらしいよ。

ご参考
http://www.geocities.jp/mickindex/database/db_optimize.html#LocalLink4

フォロありがとう。
*に直しておきます。

速度・コストは少量データでしかみていないので、
10万件ぐらいのデータで試してみてまた結果をご報告しますねー。

コメントする