• ベストアンサー

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

以下のようなテーブルがあります。 ■ 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

  • Access DLOOKUPについて

    Access DLOOKUPについて こんにちは。Access2010でのDlookupについてお教えください。 ■注文テーブル オーダーID,商品コード,数量,お店番号 001,A01,1,お店1号 001,A02,5,お店1号 002,B01,3,お店2号 002,B02,3,お店2号 ※同一オーダーIDで商品コードが重複する事は無 ■確認用注文テーブル 商品コード,数量,お店番号 A01ですよ,1お店1号 B02です,3,お店2号 ※なんと、オーダーIDがありません。さらに商品コードに変な文字列も入っています。 ■やりたい事 フォームに「判定」というテキストボックスを配置しました。 コントロールソースで以下の条件にあっているなら○、あっていないなら×と表示したいです。 ○注文テーブル.商品コードと確認用注文テーブル.商品コードを比較。 注文テーブル.商品コードのデータが確認用注文テーブル.商品コードに含まれていること。 ○注文テーブル.数量と確認用注文テーブル.数量がイコールであること。 ○注文テーブル.お店番号と確認用注文テーブル.お店番号がイコールであること。 これらを満たしていれば、○、満たしていなければ×と表示したいです。 Dlookupでなくても、何か他に方法がありましたらお教えください。 宜しくお願いします。

  • 二つのテーブルの条件抽出の仕方を教えてくださ

    SLIP +----------------------+----------------------------------+----------------------------------+ | SLIP_ID | STORE_ID |AGGREGATE_BALANCE | +----------------------+----------------------------------+----------------------------------+ | 10001 | 10000 | 25000 | | 10002 | 10000 | 150000 | +----------------------+----------------------------------+----------------------------------+ SLIP_PAY +----------------------+----------------------------------+----------------------------------+ | SLIP_ID | PAY_DATE | PAY_MONEY | +----------------------+----------------------------------+----------------------------------+ | 10001 | 2011-08-16 | 5000 | | 10001 | 2011-08-16 | 1000 | | 10001 | 2011-08-16 | 5000 | | 10002 | 2011-08-16 | 2000 | +----------------------+----------------------------------+----------------------------------+ 下記のSQLを発行すると、テーブル(1)が帰ってきますが、 テーブル(2)のような結果を返すようにするには、 SQLをどう記載すればいいでしょうか? どうかご教授お願いいたします。 SELECT slip.STORE_ID, SUM( slip_pay.PAY_MONEY ) , slip.AGGREGATE_BALANCE FROM SLIP AS slip, SLIP_PAY AS slip_pay AND slip.SLIP_ID = slip_pay.SLIP_ID AND slip_pay.PAY_DATE LIKE '2011-08%' GROUP BY slip.SLIP_ID DESC ORDER BY SUM( slip_pay.PAY_MONEY) DESC テーブル(1) +---------------+------------------------------------------+-----------------------------------+ | STORE_ID | SUM( slip_pay.PAY_MONEY ) | AGGREGATE_BALANCE | +---------------+------------------------------------------+-----------------------------------+ | 10000 | 11000 | 25000 | | 10000 | 2000 | 150000 | +---------------+------------------------------------------+-----------------------------------+ テーブル(2) +---------------+------------------------------------------+-----------------------------------+ | STORE_ID | SUM( slip_pay.PAY_MONEY ) | AGGREGATE_BALANCE | +---------------+------------------------------------------+-----------------------------------+ | 10000 | 13000 | 175000 | +---------------+------------------------------------------+-----------------------------------+

    • ベストアンサー
    • MySQL
  • グループ化したテーブルと他のテーブルの結合について

    お世話になります。PHP+MySQLでシステムを作っています。 商品のカテゴリーのテーブル・・・hametome_category(主キー:category_id ) 商品のテーブル・・・hametome_item(主キー:item_id ) 注文のテーブル・・・hametome_order(主キー:order_id ) 上記の3つのテーブルがあります。各テーブルにはそれぞれ、下記のようなデータを格納していて()内のカラムが含まれています。 hametome_category・・・カテゴリー名(category_id) hametome_item・・・商品名、単価など(category_id、item_id) hametome_order・・・注文内容等(category_id、item_id) この3つのテーブルを使い、カテゴリーごとの商品の一覧表を作り、一覧表の中に商品ごとの注文数量の累計を表示させたいと思っています。 【作りたい表のイメージ図】     単価 在庫数 注文数累計 商品A  100 1500 11000 商品B  120 1000 13000 商品C  130 1700 18000  ・  ・  ・ 表がずれていたらスイマセン^^; SELECT文を使ってデータを抽出するのですが、この際、 $sql="select * from hametome_category c,hametome_item i where i.category_id = $id and c.category_id = i.category_id ORDER BY item_id"; このようにすると任意のカテゴリーに属する商品の一覧表を出力する事は出来るのですが($idは前ページからPOSTされてきます。)、これに注文内容のデータ抽出を組み合わせようとするとうまくいきません。 この表に注文内容(hametome_orderに登録されているデータ)をitem_idでグループ化し合計したものを表示させたいです。 $sql="select *,SUM(order_amount) AS goukei from hametome_order GROUP BY item_id"; とすれば、注文数の累計をitem_idで合計しグループ化する事は出来るのですが(『order_amount』はhametome_orderテーブルに登録されている注文数です。)、この内容を最初のSELECT文にうまく組み込む事が出来ません。 どのようにすれば思うような結果を得られるでしょうか?ご教授のほどよろしくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • mysqlでのsql文

    石井と申します。 下記のデータの状態をもとに お答えをお願いします。 まず、tb_userというテーブルが id | name | age | hobby | tokugi | insert_dt -------------------------------------------- 1 | 北野 | 31 | 0101 | 0202 | 2005/6/12 という状態で、 tb_categoryというテーブルが以下のような状態になっています。 category_no | category_cd | subcategory_cd | name -------------------------------------------- 0100 | 01 | 00 | 趣味 0101 | 01 | 01 | 映画鑑賞 0102 | 01 | 02 | スキー 0200 | 02 | 00 | 特技 0201 | 02 | 01 | 早食い 0202 | 02 | 02 | 早起き ※subcategory_cdが00のとき、大項目という扱いで subcategory_cdが00以外のとき、 category_cdが同じ範囲で、 大項目に属する小項目という扱いにしています。 このとき、 『北野、映画鑑賞、早起き』というデータを1行で取得したいのですが、 select a.name, b.name from tb_user a, tb_category b where a.hobby=b.category_no or a.tokugi=b.category_no; というsqlで良いでしょうか? 手元にSQLを実行できる環境がないもので、確認させてください。

  • Oracle:グループごとに最大日付の行を1件取得

    Oracle11gで、以下のようなテーブルから、 「IDごとに、DTが最大のレコードのBUMONを1件ずつ取得」 したいです。 <テーブルTB> ID DT BUMON ------------- 1 9/1 A 1 9/2 A 1 9/3 B ★Bを取得したい 2 9/4 C 2 9/5 C ★Cを取得したい 3 9/1 D 3 9/3 E 3 9/3 E ★Eを取得したい <取得したいデータ> BUMON ------- B C E <考えたSQL> select distinct A.BUMON from (select ID, DT, max(DT) over(partition by ID) as MAXDT, BUMON from TB) A, (select ID, DT, max(DT) over(partition by ID) as MAXDT, BUMON from TB) B where A.ID = B.ID and A.DT = B.MAXDT ; 上記のような方法を考えましたが、取得できますでしょうか? 現在、SQL実行環境がない場所にいるのですが、急ぎで確認したく、 どなたかお知恵を拝借できませんでしょうか?? また、可能であれば、★のレコード全体を取得するSQLもご教授いただきたく存じます。 <★のレコード全体を取得した結果> ID DT BUMON ------------- 1 9/3 B 2 9/5 C 3 9/3 E

  • テーブル結合の条件指定について

    以下のようなテーブルが3つある場合に2つのテーブルにあるポイントを合計して取得したいと思っています。 ただ、外部結合しているtable_cに条件を与えるとうまく取得できません。 table_cにcdがある場合は条件を指定し、 ない場合は条件を指定しないようにするにはどうすればいいのでしょうか。 【table_a】 id    name ------------------ a1    aaa a2    bbb a3    ccc 【table_b】 b_id     a_id   user_id    point --------------------------------- b1     a1    00001    5 b2     a1    00002    2 b3     a3    00007    10 b4     a2    00356    10 【table_c】 c_id    user_id    cd     bonus_point ------------------------------------------------ c1     00001    cd_1    1 c2     00007    cd_2    1 c3     00356    cd_1    1 SELECT table_b.user_id as user_id , (ifnull(table_b.age_count) + ifnull(table_c.bonus_point, 0)) as total_point FROM table_a INNER JOIN table_b ON (table_b.a_id=table_a.a_id)    LEFT JOIN table_c ON (table_c.user_id=table_b.user_id) WHERE table_c.cd = 'cd_1' ORDER BY total_point desc ■結果 user_id    total_point ----------------------------- 00356     11 00001      6 ■求めたい結果 user_id    total_point ----------------------------- 00356     11 00001      6 00002     2 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLの条件抽出について

    ちょっと躓いてしまったのでアドバイスが頂けたらと思います。 user_accountというテーブルと、logというテーブルがあります。 logというテーブルには各ユーザーの書き込み履歴が残されており、日付がtimestamp形式で格納されています。 ユーザー一覧に最終発言内容をくっ付けて表示したいのですがうまくいきません。 SELECT DISTINCT * FROM user_accounts LEFT JOIN (SELECT * FROM log ORDER BY update_date DESC ) aaa ON user_accounts.pkey = aaa.user_accounts_pkey; などと記述してみましたが、思うような結果になりません。 自分の理想とする結果は以下のような出力結果です。 +----+----+----+--+-----------------+----------------+-----------+ | pkey| user| pass|      comment| update_date| +----+----+----+--+-----------------+----------------+-----------+ |  1 | test1| pass01|test03 written by test1| 40813| |  2 | test2| pass02|testestest        | 40690| どうか、お知恵を貸してください。

  • ACCESSですべての明細が一致するデータの抽出

    以下のような、構造が同じ2つのテーブルがあります。 2012注文テーブル 会社cd 商品cd A    1 A    2 B    1 C    1 2013注文テーブル 会社cd 商品cd A    1 A    2 B    1 B    2 C    2 このとき、両方のテーブルの注文が完全に一致した会社(この例ですとA社)のみを 抽出したいのですが、うまくいきません。 select distinct a.会社cd from 2012注文 a, 2013注文 b where a.会社cd = b.会社cd and a.商品cd = b.商品cd などでは、1つだけ一致するB社も抽出されてしまいます。 すべてのレコードが一致する会社だけを抽出するには、どうすればよいのでしょうか。 よろしくお願いします。

  • 商品カタログ「この商品を買った人は、こんな商品も買っています」について

    はじめまして。 商品データベースのカタログ表示の際のSQLの質問です。 www.amazon.co.jp のサイトでは、ある商品を選択すると、「この商品を買った人は、こんな商品も買っています」と表示されます。 この内部的な処理方法を教えてください。 例えば、以下のような単純なテーブルがあるとします。 ●顧客テーブル ・顧客番号 ・顧客名 ●商品テーブル ・商品ID ・商品名 ・販売単価 ●注文テーブル ・注文番号 ・注文日時 ・顧客番号 ・小計 ●注文詳細テーブル ・注文番号 ・注文詳細番号 ・商品ID ・数量 このような設計の場合、「ある商品を買った人は、こんな商品も買っています」を実現するために ・バッチで裏で処理するのでしょうか?それとも注文のたびに処理するのでしょうか? ・どのテーブルに、保存するのでしょうか? ・どのようなSQL文になりますか?(具体的に教えてください) また、別の適切な設計方法があるのでしょうか? 困っています・・・ お手数ですがよろしくお願い致します。

  • 注文した商品名をマスターで作るか

    Access 2013 vba 今工事のための材料の注文履歴を保存するテーブルと画面を作っています。 この商品名や、単価、仕入れ値などのデータは、管理テーブルを作成してそこで管理し、そこから商品IDを選択すると、注文履歴の画面にIDだけがセットされるような作りにしようと考えています。 【注文内容の入力画面A】 ・注文日 ・受注ID ・商品ID ・注文先ID ・単価 ・数量 ・単位 【商品管理テーブル】 ・商品ID ・メーカーID ・単価 ・品番 このようにすると、商品管理のテーブルのレコードを勝手に削除されたりした場合に、大変な事になることを考えると躊躇してしまいます。 商品管理のテーブルはあくまでも参照にとどめて、その商品名や品番などは、注文履歴を保存する画面のフィールドに保存したほうが良いか、迷っています。 この点で良いアドバイスがあれば、よろしくお願いします。

このQ&Aのポイント
  • 宛名職人29 Macのメインアカウントで起動できない状態について質問があります。
  • Mac studioへのインストール後、メインのアカウントだけ起動できないエラーが発生しています。
  • 他のアカウントやゲストアカウントでは起動ができるため、対策方法を教えていただきたいです。
回答を見る