- ベストアンサー
できる人には、簡単な問題だと思うのですが・・・・
以下のようなテーブルがあります。 ■ tb_order (注文テーブル) ※pkey は、order_cd order_cd | user_cd | sale_cd 100 user1 A 200 user2 A 300 user3 B 400 user3 A ■ tb_order_goods(注文商品テーブル) ※pkey は、order_goods_id order_goods_id | pay_dt | order_cd 001 20040812 100 002 100 003 20040812 100 004 20040813 200 005 300 006 400 007 20040814 400 008 400 #データの状態# (user_cd=user1)の人が、あるセール(sale_cd=A)の日に 3つの商品(order_goods_id=001,002,003)を、注文しました(order_cd=100)。 前払いをした商品には、pay_dtが入ります。 #質問# sale_cd が Aのときに、前払いした人のuser_cdを取得したいのですが、 どのようなSQL文を作れば効率がいいのでしょうか? select user_cd from tb_order where sale_cd='A' and order_cd in ( select distinct order_cd from tb_order_goods where pay_dt is not null); とやれば、取得できると思いますが、tb_order_goods の全データを見てからの 抽出なので、効率が悪い気がします。 tb_order から、sale_cd='A' のorder_cd を抽出してて、order_cd を限定してから、 tb_order_goodsで、pay_dt is not nullをすれば、より早いと思うのですが・・・。 JOIN等の結合を使えばいいと思うのですが(多分)、 どのような結合がこの場合に適したものになるのか分からないため、 教えていただければと思います。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
select user_cd from td_order_goods inner join td_order on td_order_goods.order_cd = td_order.order_cd where pay_dt is not null and to.sale_cd='A' 上記のように結合できると思います。 td_orderテーブルをある条件で絞り込んでから td_order_goodsテーブルを検索すると、 JOIN項目が主キーではないので テーブル全体を検索することになります。 逆に、td_order_goodsを絞り込んでから td_orderを検索するようにすると、 主キーでJOINしますので、効率が良いです。 もし、td_order_goodsのorder_cdに 二次インデックスを作成できるのであれば 逆にtd_orderから検索してJOINすれば インデックス項目でJOINしますので 効率が良くなります。 どちらを先に絞り込むかは、 データ件数の少ないほうを先にやったほうが良いです。 いろいろ試してみてください。
その他の回答 (1)
- Mizyu
- ベストアンサー率41% (245/593)
SELECT user_cd FROM td_order to, tb_order_goods tog WHERE to.order_cd = tog.order_cd AND tog.pay_dt is not null AND to.sale_cd='A' ------------- このような形でどうでしょうか? ※user_cdがかぶるのはNGであればDISTINCTを付けてください。