• ベストアンサー
  • すぐに回答を!

OUTER JOINについて

こんにちわ。 OUTER JOINを使ったSQL文について質問させてください。 今3つのテーブル(EMPLOYEES, CUSTOMERS, ZIPCODES)があるとします。郵便番号ごとに従業員とお客さんのIDを表示するSQLはわかるのですが(下に書きます)、郵便番号ごとに従業員とお客さんの数を表示するSQL文がわからず、途方に暮れてます。どなたか教えていただけないでしょうか? よろしくお願いいたします。 郵便番号ごとに従業員とお客さんのID SQL> select z.zip, e.eno, c.cno from zipcodes z full outer join employees e on (z.zip=e.zip) full outer join customers c on (z.zip=c.zip); ZIP ENO CNO ---------- ---------- ---------- 49008 1001   1111 49009    2222 49001 1000 3333 49017 1002 49023 49024 それをこうしたいのですが・・ ZIP ENUM CNUM  ---------- ---------- ---------- 49008 1 1 49009 1 49001 1 1 49017 1 49023 49024

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数263
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.2

データの関係性がイマイチ理解できないのですが・・ 投稿内容通りに、SQLを素直に書き直すと、 select z.zip, count(e.eno) enum, count(c.cno) cnum from zipcodes z full outer join employees e on (z.zip=e.zip) full outer join customers c on (z.zip=c.zip) group by z.zip ;

共感・感謝の気持ちを伝えよう!

質問者からのお礼

korochanさん ありがとうございました。 なぜかぜんぜん思いつきませんでした。

関連するQ&A

  • 多数のテーブルでのFULL OUTER JOIN

    SQL Sever 2005 を利用しております。5つのテーブルから値を取得するSQL文を作成したいと考えております。3つまでのテーブルのFULL OUTER JOIN は例がるのですがそれ以上となると調べても判りませんでした。ご教授お願い致します。 TABLE1~TABLE2は同じ構成で発生した5つのテーブルを1つのテーブルに合体して データどれか1つのテーブルで発生すれば表示したい。 出来れば現在作成中のSQL文がFULL OUTER JOINで作成しているのでこれを流用したいので FULL OUTER JOIN の方法で教えて頂ければ幸いです。 以上よろしくお願い致します。 (※IDが主キー) テーブル名:TABLE1 ID-----金額 ----------- 01-----1000 11-----2000 テーブル名:TABLE2 ID-----金額 ----------- 02-----2000 12-----3000 テーブル名:TABLE3 ID-----金額 ----------- 03-----3000 テーブル名:TABLE4 ID-----金額 ----------- 02-----1000 04-----4000 テーブル名:TABLE5 ID-----金額 ----------- 01-----1000 05-----5000 作成したいSQL文の結果 ID-----TABLE1金額---TABLE2金額---TABLE3金額---TABLE4金額---TABLE5金額 01-----------1000----------------------------------------------------1000 02-------------------------2000------------------------1000 03----------------------------------------3000 04-----------------------------------------------------4000 05-------------------------------------------------------------------5000 11-----------2000 12-------------------------3000

  • JOINのネスト制限?

    基本的な問題かもしれませんが、SQLのJOINの使い方が判らないので教えて下さい。 SQLで A表とB表とC表をINNER JOINした表に対して、 D表をOUTER JOINした結果に対して、E表をINNER JOINしたいのですが、 SQL文で書くことは可能でしょうか? SELECT ((((cols FROM A INNER JOIN B ON --) INNER JOIN C ON --) OUTER JOIN D ON --) INNER JOIN E ON --) と単純に書くとネスト数のオーバーなのかエラーが出ます。 後ろの部分だとサブクエリーに対してJOINすればよいかもしれませんが、主ファイルに当る部分の場合はサブクエリーに切り出す方法が判りません。 よろしくお願いします。

  • 実行計画HASH JOIN RIGHT OUTER

    以下のようなSQLがあるとします。 ------------------------ SELECT * from (select * from TABLE-A where 条件色々) AA, TABLE-B BB where BB.x(+) = AA.x ------------------------ TABLE-Aの件数は非常に多く(例100万)、条件は複雑です。 TABLE-Bの件数は少ないです(例30件) この時、実行計画が HASH JOIN RIGHT OUTER TABLE ACCESS FULL TABLE-B のように出ましたが、どのように解釈すれば良いのでしょう? TABLE-Bは件数が少ないのでACCESS FULLでも問題ないでしょうか? HASH JOIN RIGHT OUTER のコストが高くなってて気になってます。 たとえば、この場合のより適切な実行計画ってありますか?

その他の回答 (1)

  • 回答No.1

こんなんでできそうな気がしますが、どうでしょう? こちらに環境がありませんので試していません。 もしも、期待されている結果と違う場合はお手数ですが補足をお願いいたします。 select z.zip, nvl(e.e_cnt, 0) e_cnt, nvl(c.c_cnt, 0) c_cnt from zipcodes z full outer join (select count(*) e_cnt, zip from employees group by zip) e on (z.zip=e.zip) full outer join (select count(*) c_cnt, zip from customers group by zip) c on (z.zip=c.zip);

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • LEFT OUTER JOIN でB表の制限付きで表示したいのですが

    はじめまして。midwagonです。 SQLがわからないので教えてください。 A表:id,name B表:id,hiduke これを結合してA表にあるものをすべて表示したいのですが B表のhiduke="20080531" と 日付の制限をかけると何もかえってきません。 どうすればいいのか教えてください。 select A.id,A,name from A left outer join B on A.id=B.id where B.hiduke="20080531";

  • JOIN句への変換

    はじめまして。 「*=」をJoin句に直したいのですが、同様の結果がえられません(T.T) SQL初心者です、どうぞよろしくお願いいたします。 この式をJOIN句に直したいです。 FROM A_TBL, B_TBL as B_TBL01, B_TBL as B_TBL02, C_TBL, D_TBL WHERE A_TBL.No = B_TBL01.No AND A_TBL.No = B_TBL02.No AND A_TBL.No = C_TBL.No AND A_TBL.No *= D_TBL.No AND C_TBL.ID *= D_TBL.ID AND ↓こうしたのですが、正しい結果がえられません。 FROM (D_TBL RIGHT OUTER JOIN C_TBL ON C_TBL.ID = D_TBL.ID) RIGHT OUTER JOIN A_TBL INNER JOIN B_TBL AS B_TBL01 ON A_TBL.No = B_TBL01.No1.No INNER JOIN B_TBL AS B_TBL02 ON A_TBL.No = B_TBL02.No2.No ON A_TBL.No = D_TBL.No AND A_TBL.No = C_TBL.No どうぞ、ご教授お願いいたします。

  • 2つのテーブルで一致しているものを抽出する。SQL文で作成。

    OS:WindowsXP SQLServer2000 <質問> SQL文が浮かばなくて困っています。 どなかたお力を貸していただけないでしょうか。 以下、やりたいことです。 【条件】 1 AテーブルとBテーブルで郵便番号が一致しているものを抽出 2 AテーブルとBテーブルに「番号」列を追加し、初期値を「0」とする 3 1の抽出後、同じ郵便番号がBテーブルに複数あった場合、   2で追加した「番号」列を0→”抽出した行分の数字”にする。 一応、【条件】1の箇所(下記)は浮かんだのですが、 2と3が分かりません。 select Aテーブル.*,Bテーブル.* from Aテーブル,Bテーブル left outer join Aテーブル on Aテーブル.郵便番号 = Bテーブル.郵便番号 WHERE ??? ●Aテーブル ID  | 名前 | 郵便番号  | 番号 ----------------------------------------------------------------- 01 |  小林 | 101-1000 | 0 02 |  鈴木 | 102-1000 | 0 03 | 田中  | 103-1000 | 0 04 | 町田  | 104-1000 | 0 05 | 木村  | 105-1000 | 0 06 | 中田  | 106-1000 | 0 ●Bテーブル ID | 分類  | 郵便番号   | 番号 --------------------------------------------------------------------- 01 | AAA  |  101-5555  | 0 03 | CCC  | 103-1000  | 0 04 | DDD  | 104-1000  | 0 05 | EEE  | 105-1000   |  0 06 | FFF  |  105-1000   | 0 07 | GGG  | 106-1000  | 0 08  | HHH  | 106-1000   | 0 09 | KKK  | 106-1000   | 0 ↓出したい結果↓ ID  | 名前 | 郵便番号   | 分類  | 番号 ------------------------------------------------------------------------------- 03 | 田中 | 103-1000  | CCC   |  0 04 | 町田 | 104-1000  | DDD  |  0 05 | 木村 | 105-1000  | EEE  |  2 05 | 木村 | 105-1000  | FFF  |  2 06 | 中田 | 106-1000  | GGG  |  3 06 | 中田 | 106-1000  | HHH  |  3 06 | 中田 | 106-1000  | KKK  |  3 以上になります。 どうぞよろしくお願い致します。

  • SQL 重複しないJoinの仕方を教えてください

    データが重複しないSQL文の書き方を教えてください。 下記のような2つのテーブルがあり、「管理番号」でOnして「使用数」をJoinさせ、かつ重複しないようにSQLを作成したいのですが、MySQLで可能でしょうか? ※0002に関しては、テーブル2の方がデータ数が多いため、Join後は2行になって「使用数」は重複せず、「数」の部分には0が入ればベストです 【テーブル1】 日付    品番  管理番号 数 2012/6/12 A987  0001 500 2012/6/14 A987  0001 300 2012/6/16 A987  0001 400 2012/6/18 A987  0001 800 2012/6/12 A987  0002 750 2012/6/12 A987  0003 540 2012/6/14 A987  0003 740 2012/6/16 A987  0003 840 2012/6/18 A987  0003 240 2012/6/20 A987  0003 640 【テーブル2】 日付    品番  管理番号 使用数 2012/7/10 A987  0001 160 2012/7/11 A987  0001 260 2012/7/10 A987  0002 220 2012/7/12 A987  0002 320 2012/7/20 A987  0003 530 2012/7/22 A987  0003 430 2012/7/24 A987  0003 830 【テーブルJoin】 日付    品番  管理番号 数 使用数 2012/6/12 A987  0001 500 160 2012/6/14 A987  0001 300 260 2012/6/16 A987  0001 400 0 2012/6/18 A987  0001 800 0 2012/6/12 A987  0002 750 220 2012/6/12 A987  0002 0 320 2012/6/12 A987  0003 540 530 2012/6/14 A987  0003 740 430 2012/6/16 A987  0003 840 830 2012/6/18 A987  0003 240 0 2012/6/20 A987  0003 640 0

  • SQL文の質問 JOINとORDERの組み合わせ

    現在下記にてSQLを作成しています ■わからないこと JOINでORDER(昇順)を設定するにはどうすればよいのでしょうか? 現在ではエラーが出ます(演算子がありません) mySQL = "SELECT B.B名, B.D番号 " & _ "FROM Bフレ INNER JOIN B ON B.D番号=Bコード.コード " & _ "WHERE(((B.日付)>=#" & orderDate & "#) AND ((B.日付)<=#" & shipDate & "#)) " & _ "GROUP BY Bコード.B名, B.D番号" & _ "ORDER BY B.D番号 ASC; わかる方ご教授願います

  • 【SQL】他テーブルに含まれる値に合致する行を抽出

    SQL素人ですが、SQLが使えるツールからデータを抽出したく、SQL文を教えていただけますでしょうか。 ・テーブルA:会員データが格納されている(氏名、メルアド、郵便番号等が入っている) ・テーブルB:特定の郵便番号のみが入っている テーブルAのデータの中からテーブルBに入っている郵便番号に合致するメルアドを抽出したい。 何卒宜しくお願い申し上げます。

  • Ticketmasterでの予約

    Las VegasのWYNNホテルでやっているLe ReveをTicketmasterから 予約しようと思ったのですが、Deliver My Ticketsに 「International Will Call」がありません。 あるのは「US Customers」と「Customers in Canada」だけです。 仕方なく「US Customers」か「Customers in Canada」を選択し 先に進んでも、国名の変更が出来ず、州を選択しなければエラーに なります。州を選択すると郵便番号が違うというエラーになります。 これは、アメリカ人とカナダ人(在住者)しか買うことが出来ない のでしょうか? 州と郵便番号だけダミー(例えばネバダ州を選択し、郵便番号を89109) で入力すればいいのかとも思ったのですが、クレジットカードの請求、 又は、チケット受け取りの時に問題になるのでしょうか? 尚、割引されるプロモーションコードを持っているため、 WYNNの公式サイトや現地で買うことは考えておりません。 又、英語は苦手です。

  • 郵便番号検索

    現在商売をやっていて、お客さんに案内状を出そうと思うのですが、控えてある住所が戸籍に載っている正式な住所で、郵便番号検索が出来ません。インターネットで郵便番号検索をしても、各地域を通り名の様なもので分けてあり、お客さんの住所の郵便番号がさっぱり分かりません。このような場合はどうやって調べたらよいのでしょうか?ちなみに電話番号は控えてません。

  • zip code

    世界のZIP CODE(郵便番号)の検索サイトお判りになる方 教えてください。

  • amazon.com(海外のサイト)で本を代引きで買いたいのですが。。

     海外のアマゾンでしか買えない本があるのですが、クレジットカードは親が駄目だと言うので代引きで買いたいのですが、どうすればよいでしょうか? Full Name: Address Line1: Address Line2: State/Province/Region: ZIP/Postal Code: Country: Phone Number: 名前(Full Name)と郵便番号(ZIP Code)と国(Country)と電話番号(Phone Number)は何を入れればよいのかわかりますが、住所がどこにどういれればよいのかわかりません。そして、どのように届くのかもお教えして頂けますと有難いのですがどうでしょうか?よろしくお願い致します。