• ベストアンサー

SQLで違うテーブルの結果を組み合わせたい

SQLでどう結果を返したらいいのかわからないので力を貸してください。 下記の受注表と入荷表があります。 受注表 担当 商品コード 顧客コード ── ──── ───── 田中 A1 001 田中 A1 002 田中 A1 003 山田 A2 020 山田 A1 003 田中 A1 020 入荷表 担当 入荷コード 入荷日 ── ───── ───── 山田 X013 20080701 山田 X013 20080701 田中 X013 20080701 山田 X013 20080630 山田 X013 20080630 田中 X123 20080630 自分の欲しい結果を出すためのSQLは下記のクエリです。 ≪受注表テーブルから≫ SELECT 担当, 顧客コード FROM 受注表 WHERE 担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '003' ; SELECT 担当, 顧客コード FROM 受注表 WHERE 担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '020' ; ≪入荷表テーブルから≫ SELECT 担当, 入荷日 FROM 入荷表 WHERE 担当 = '田中' AND 入荷コード = 'X013' AND 入荷日 = '20080701' ; SELECT 担当, 入荷日 FROM 入荷表 WHERE 担当 = '田中' AND 入荷コード = 'X123' AND 入荷日 = '20080630' ; これらで出る結果をただ下記のように横並びに出したいのですがどうしたらよいでしょうか? 「担当」の項目に関しては複数でますが気にしないで下さい。 ただ全く関係のないテーブル同士の結果を「横並び」表示にしたいだけです。 担当 顧客コード 担当 顧客コード 担当 入荷日 担当 入荷日 ── ───── ── ───── ── ──── ── ───── 田中 003 田中 020 田中 20080701 田中 20080630

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

原則論でいえば、SQLはデータを抽出、集計するものであって、データのレイアウトをするためのものではないです。しかし、私もそういうリクエストは受けたことがありますよ。 (項目自体は関係なくても「並べて見たい」というユーザはいますね) SQLではできないと思われるのも何なので、SQL Server 2005の例を挙げます。それぞれのクエリの○行目がそろえばいいわけです。 SELECT a.担当, a.顧客コード, b.担当, b.顧客コード, c.担当, c.入荷日, d.担当, d.入荷日 FROM (SELECT ROW_NUMBER() OVER (ORDER BY 担当) SEQ, 担当, 顧客コード FROM 受注表 WHERE 担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '003') a FULL OUTER JOIN (SELECT ROW_NUMBER() OVER (ORDER BY 担当) SEQ, 担当, 顧客コード FROM 受注表 WHERE 担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '020' ) b ON b.SEQ=a.SEQ FULL OUTER JOIN (SELECT ROW_NUMBER() OVER (ORDER BY 担当) SEQ, 担当, 入荷日 FROM 入荷表 WHERE 担当 = '田中' AND 入荷コード = 'X013' AND 入荷日 = '20080701') c ON c.SEQ=COALESCE(a.SEQ,b.SEQ) FULL OUTER JOIN (SELECT ROW_NUMBER() OVER (ORDER BY 担当) SEQ, 担当, 入荷日 FROM 入荷表 WHERE 担当 = '田中' AND 入荷コード = 'X123' AND 入荷日 = '20080630' ) d ON d.SEQ=COALESCE(a.SEQ,b.SEQ,c.SEQ) ORDER BY COALESCE(a.SEQ,b.SEQ,c.SEQ,d.SEQ)

その他の回答 (2)

回答No.2

select * from ( SELECT 担当, 顧客コード FROM 受注表 WHERE 担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '003' ) as a, ( SELECT 担当, 顧客コード FROM 受注表 WHERE 担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '020' ; ) as b, ( SELECT 担当, 入荷日 FROM 入荷表 WHERE 担当 = '田中' AND 入荷コード = 'X013' AND 入荷日 = '20080701' ; ) as c, ( SELECT 担当, 入荷日 FROM 入荷表 WHERE 担当 = '田中' AND 入荷コード = 'X123' AND 入荷日 = '20080630' ; ) as d ; で、4つの問い合わせ結果の総当たりの結果が得られます。 各SQLが1件ずつしか返さないのであれば、お望みの結果になります。 >ただ全く関係のないテーブル同士の結果を「横並び」表示にしたいだけです 無条件に結合するなら、条件を書かなければ良いだけです。

回答No.1

>ただ全く関係のないテーブル同士の結果を「横並び」表示にしたいだけです ルールが明確でないから、他人からアドバイスできないし、SQLも提示できないのです。 データは今回示されたもの以外、一切、存在しないのですか?それならば、強引にSQLを記述することも可能です。 そもそも、今回の得たい結果というのは、すべて条件式で指定している訳で、SQLでは存在の有無だけ分かればいいのでしょうか? RDBMSを使う意味、SQLを使う意味が、まったくないと思いますが?