本日はSQLネタです。
下記のようなテーブル構成があったときとします。
注文ヘッダと注文詳細は(1:N)とします。
ここで、product_id=5を含んだ注文ヘッダーレコードを取り出したいとします。
この場合、
1 2 3 4 5 6 7 8 9 10 |
select order_tb.* from order_tb o_tb join order_item_tb oi_tb on o_tb.id = oi_tb.order_id where oi_tb.product_id = 5 |
とやってはいけません。
上記のようなSQLを発行するとJOINされた結果全てがでてきます。
本来1行の答えが返ってくる場合、3行分の注文ヘッダーテーブルがでてきてしまいます。
こんな時には副問い合わせを使い、下記のように記述すると1行分の答えを取り出すことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
select o_tb.* from order_tb o_tb where exists ( select oi_tb.* from order_item_tb oi_tb where o_tb.id = oi_tb.order_id and product_id =5 ) |
参考リンク