SQLの組み立て(AがあればA、なければB)

SQLの組み立てについて

 

SQL組み立てるときは、基本的なとこからちょっとずつ組み立てる。

考え方を覚えることで色んなことに対応できるようになるはず!と信じてメモ。

 

(今回の取得項目)

テーブルJの項目全て

 

(条件)

①テーブルHの「機械」が指定のもの 。

 

(テーブルHの条件) 

②HとJは、「番号」で結合する。

③ただし「番号」で結合したとき、HとJは、N対1なので、以下の条件でHを一意に絞る。

④Hの「工程」が「02」で始まるものがあれば、その行を使用する。

⑤Hの「工程」に「02」で始まるものがなく、「01」で始まるものがあれば、その行を使用する。

⑥Hの「工程」に「01」「02」で始まるものがなければ、対象外になる。

 

これを外部結合使わずにやる。

(他にも制限あって外部結合はNGだった。)

 

Select  * from J 

Where 

EXISTS 

(

Select * from H

Where

H.番号 = J.番号

AND 

H.機械 =(画面指定のもの)

AND EXISTS 

(

Select SUB.番号

From H SUB 

Where 

SUB.番号 =H.番号

AND 

(工程 like ' 01%' OR 工程 like '02%' )

Having

MAX (SUB.工程)=H.工程

GROUP BY SUB.番号

)

)

)

 

①Hから工程が01と02のものをとって

②番号でくくって大きい方をとって

③ひとつに絞れたのでその機械を検索条件に使い

④HとJの番号と結合してJの条件にしてやる

 

うろ覚えなので書き方間違えてるかも。

 

でも正直構文とかはどうでもよくて、「場合分け」って言うのを「大きい方をとる」って条件に考え方を変えるのがポイントかと。

 

ユニオンすれば私も書けたけども、それじゃパフォーマンス悪かった。

先輩が考えてくれた文のがパフォーマンスがよい。副問合せもコストはかかるけど、インデックスがうまくきいたらしい。

発想の転換と段階を踏むことが、SQLを作る上では大切らしい。