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を作る上では大切らしい。