SQL文を作るとき、けっこう使うことになるのに何故か知られてない?サブクエリ。恐らくは処理が遅いとか、コストがかかるとかそんな理由が大きくかかわっているのでしょうけれど、「サブクエリ型SQLをまず書いて、ここから結合クエリへ分解する」「結合クエリをサブクエリ型SQLへまとめなおす」が出来るようになっておくと、SQL文の説明をするのがとても簡単、かつ、確実に情報を伝えることができやすくなります。
まぁテーブル一杯の業務アプリではよくある話で、
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=39289&forum=26
を例にとると
table1とtable2はKey1でLeftJoinされ、table2とtable3はKey1,Key2でLeftJoinされる
それぞれのテーブルのDelFlgで削除可否を決めたい
ということなら、考え方は、
Table1の削除したい候補の塊 DEL1
Table2の削除したい候補の塊 DEL2
Table3の削除したい候補の塊 DEL3
Table3の削除したくない候補の塊 NOTDEL3
をまず用意。
つぎに、
DEL1とDEL2の両方に含まれるキーの塊 DEL12
DEL12とDEL3の全部に含まれるキーの塊 DEL123
DEL12にあってNOTDEL3の全部に含まれるキーの塊 NOTDEL123
を作り出してしまえば、
DEL12とDEL123でUNION ALLしたキーからNOTDEL123を除いたものが削除するべきレコードキー DELKEY
がきまるので、
TABLE1からDELKEYを削除
TABLE2からDELKEYを削除
TABLE3からDELKEYを削除
で、解決ですね。
後は、それぞれのプラットホームにあわせて、SELECT-SQLを作成し、最後にDELETE文。
複雑なSQLがかけない人でも、この概念を理解してもらえればストアドプロシジャでだって書ける。
どんなプラットホームのDBでも何とかなる。
大事なのは、SQL文を書く、ってことじゃなく、どうやったら答えとなる塊を取り出せるか、を考える事。それを思うのには、いきなり結合クエリより、サブクエリで考えて概念を理解してから結合に書く方がずっと作る側の勉強にもなると思うデスよ。