新しく質問する

from...where を from...join..on にするには

役に立った:0件
  • 質問者:nekosogi
  • 投稿日時:2006/03/10 19:24
  • 困り度:暇なときに回答をください
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

以下のSQL文は from ... where ... で書かれていますが
これを from ... join ... on ... で書き直したいのですが可能でしょうか?

select X.col1, U.col1

from TABLE_X as X ,TABLE_U as U

where U.REC_NO = (select B.REC_NO
from TABLE_A as A, TABLE_B as B
where A.ITME = B.ITEM
and X.DATA = A.DATA
fetch first 1 row only )

むずかしくしているのは、fetch first 1 row only なのですが
これがないと where句のかっこのなかのselect文は複数の結果を返します
しかし、その複数の結果はすべて同じものになることがデータ上保証されています

fetch first を除いて select distinct としても同じ結果となりますが
パフォーマンスがひどく低下してしまいます。

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:0件)
  • 参考になった:0件

No.2ベストアンサー20pt

  • 回答者:maguromaru
  • 回答日時:2006/03/13 21:43

on句は結合条件でfetch firstは抽出条件なのでwhere句をon句にする単純な書き直
しはできないと思います。やるとしたら副選択のselect文をfrom句に書いて一時テーブルとしてfetch firstをdistinctにするしかないような気がします

select X.col1, U.col1
from
(select distinct B.REC_NO
from TABLE_A as A, TABLE_B as B
where A.ITME = B.ITEM
and X.DATA = A.DATA) as Z
inner join TABLE_X as X on ...
inner join TABLE_U as U on ...

fetch first にくらべて distinct なので遅いような気がしますが
実際には副選択がないためにそための内部的に作られる一時表が軽くなるのでこちらのほうが速いと思います。

通報する

この回答へのお礼

このとおりに試したら数倍速くなりました。
びっくりです。
一時表の作られ方を考えないといけないですね。
ありがとうございました。

  • 参考になった:0件

IBMのDB2のSQLですか?

書き直す理由は?
→書き直す方法があっても、特定のRDBMSの独自機能を含んでいたら意味がないのですよね?

>fetch first を除いて select distinct としても
>同じ結果となりますがパフォーマンスがひどく低下

1対nになるのは、どの表、どの条件式ですか?
インデクスを定義しても、実用に耐えない状況ですか?

通報する

この回答へのお礼

DB2のSQLです。
研究あるいは挑戦です(笑)。
できないならしょうがないのであきらめます。

  
このQ&Aは役に立ちましたか?(役に立った:0件)

このページのトップへ

Facebook公式ページ

公式Twitter