プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (2件)

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

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

お礼日時:2006/03/17 20:05

IBMのDB2のSQLですか?



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

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

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

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

お礼日時:2006/03/12 17:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!