• ベストアンサー

SQL文の処理速度向上策について

はじめまして 当方、初心者で勉強の身です。ご回答頂けたら幸いです。 3つのテーブルから下記条件の項目を取得したのですが どうにも処理速度が遅く困っております。 副問い合わせなどを使い、速度向上を図りたいのですが 良い案はありませんでしょうか。 <テーブル>テーブル名(項目1,項目2・・・) (1)music(項目1~20)総レコード数1万件 (2)data(項目1~12)総レコード数6万件 (3)inside(項目1~18)総レコード数4万件 3テーブルとも3つの同一項目のKeyで構成されています。 <条件> 今日追加された(1)テーブルのレコードの中で(2)、(3)のテーブル両方ともに存在しないレコードを取得すること。(比較項目は3つのKeyのみ) ちなみに現在のSQLは以下の用になっています。 select DISTINCT a.1, a.2, a.3 (3つともKey項目です。) from music a, data b, inside c where a.4 = 20091118 (該当レコードは10件程度です。) and a.1 != b.1 and a.1 != c.1 and a.2 != b.2 and a.2 != c.2 and a.3 != b.3 and a.3 != c.3 結果として出力されるレコードは5件程度です。 以上です。よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.1

create table music (col1 char(1), col2 char(1), col3 char(1), col4 char(8) ); create table data (col1 char(1), col2 char(1), col3 char(1) ); create table inside (col1 char(1), col2 char(1), col3 char(1) ); insert into music values('1','1','1','20091118'); insert into data values('1','1','1'); insert into inside values('1','1','1'); insert into music values('2','2','2','20091118'); insert into data values('2','2','2'); insert into music values('3','3','3','20091118'); insert into inside values('3','3','3'); insert into music values('4','4','4','20091118'); このSQLって、本当に意図通りの結果が求まります? select DISTINCT a.col1, a.col2, a.col3 from music a, data b, inside c where a.col4 = 20091118 and a.col1 != b.col1 and a.col2 != b.col2 and a.col3 != b.col3 and a.col1 != c.col1 and a.col2 != c.col2 and a.col3 != c.col3 ; Col1 Col2 Col3 ---- ---- ---- 4 4 4 3 3 3 1 1 1 2 2 2 私が書くとすると以下です。 select a.col1, a.col2, a.col3 from music a where a.col4 = 20091118 and not exists (select 'X' from data b where a.col1=b.col1 and a.col2=b.col2 and a.col3=b.col3) and not exists (select 'X' from inside c where a.col1=c.col1 and a.col2=c.col2 and a.col3=c.col3) ; Col1 Col2 Col3 ---- ---- ---- 4 4 4 あとは以下のようにかきます。 select a.col1, a.col2, a.col3 from music a left outer join data b on a.col1=b.col1 and a.col2=b.col2 and a.col3=b.col3 left outer join inside c on a.col1=c.col1 and a.col2=c.col2 and a.col3=c.col3 where a.col4 = 20091118 and b.col1 is null and c.col1 is null;

c_gen
質問者

お礼

返答ありがとうございました。 上記SQLで実行できることが確認できました。 >このSQLって、本当に意図通りの結果が求まります? すいません、検討案の方を掲載していました。 誤解を与えて申し訳ありません。 上記の検討案は3rd_001様の仰る通り間違っております。

その他の回答 (1)

回答No.2

> select DISTINCT a.1, a.2, a.3 (3つともKey項目です。) 同じ意味合いのキー項目がdata,insideにもあるようですので [SQL] select column1, column2, column3 from music where a.4 = 20091118 minus (   select column1, column2, column3 from data   union   select column1, column2, column3 from inside ) でいかがでしょう?

c_gen
質問者

お礼

返答ありがとうございました。 上記SQLで実行できることが確認できました。

関連するQ&A