みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

以下の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 としても同じ結果となりますが
パフォーマンスがひどく低下してしまいます。

投稿日時 - 2006-03-10 19:24:42

QNo.2020371

暇なときに回答ください

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

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 なので遅いような気がしますが
実際には副選択がないためにそための内部的に作られる一時表が軽くなるのでこちらのほうが速いと思います。

投稿日時 - 2006-03-13 21:43:01

お礼

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

投稿日時 - 2006-03-17 20:05:44

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

IBMのDB2のSQLですか?

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

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

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

投稿日時 - 2006-03-12 03:16:56

お礼

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

投稿日時 - 2006-03-12 17:10:19