• ベストアンサー

できる人には、簡単な問題だと思うのですが・・・・

以下のようなテーブルがあります。 ■ 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等の結合を使えばいいと思うのですが(多分)、 どのような結合がこの場合に適したものになるのか分からないため、 教えていただければと思います。

質問者が選んだベストアンサー

  • ベストアンサー
  • grace2973
  • ベストアンサー率66% (16/24)
回答No.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)
回答No.1

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を付けてください。

関連するQ&A