• 締切済み

複数の外部結合のやり方

店舗表(SHOP)、ビル表(BIL)、都道府県表(AREA)、関連表(LINK)を取り出すSQLを 作成しています。 以下の状態だと店舗表(SHOP)とビル表(BIL)が紐づいていないデータにも都道府県 が出てしまいデータとしておかしなことになっています。 (BIL(B)とBIL(C)の紐付きがないから?) Oracleのように外部結合(+)が使えず・・・どのように修正すればいいか教えてください。 SELECT S.SHOP_ID,S.SHOP_NAME,A.TIIKI_NAME,A.TODOUFUKEN_NAME,B.BIL_NAME,B.ADDRESS,B.MEMO FROM SHOP AS S LEFT JOIN BIL AS B ON S.BIL_ID=B.BIL_ID, BIL AS C RIGHT JOIN AREA AS A ON .TODOUFUKEN_ID=A.TODOUFUKEN_ID, LINK AS L WHERE S.TIIKI_ID=A.TIIKI_ID AND S.DELETE=0 GROUP BY SHOP_ID ORDER BY A.TIIKI_ID,S.SHOP_ID よろしくお願いします。

  • MySQL
  • 回答数1
  • ありがとう数1

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ちょっとわかりにくいSQLですね。 もうすこし質問を絞ったほうがよろしいのでは? どういうデータからどういう結果がみちびかれる期待をしているのか 整理したほうがよろしいでしょう。 ご理解なさっているようですが完全外部結合はどっちにしろできませんので

getamato
質問者

お礼

ありがとうございます。 S.TIIKI_ID=A.TIIKI_ID で条件を絞ってしまっていたためと、TIIKI_IDに重複IDがあったため他にも原因がありました。 一応解決しました。

関連するQ&A

  • 外部結合について

    left joinとright joinが交じり合った構文で途方に暮れています・・。 以下の(+)を使わずに、left joinとright joinを使うにはどのように書けばいいのでしょうか? ・・・・・・ FROM A,B,C WHERE A.CD=B.CD(+) AND B.NAME(+)=MAX(A.NAME) すみませんがよろしくお願いします。

  • 多段外部結合はできる?

    mysqlにおいて、多段の外部結合はできるのか今模索しております。 例えば、A、B、Cと3つテーブルがあった場合に、 「Aに対してBを外部結合」 「Bに対してCを外部結合」 としたいのですが、どうやってもCテーブルの値が取得できず常にNULLになっている状態です。 例として、以下の条件で実行すると、Cテーブルの値が取得できません。 ---- (テーブル) A [id, name, b_id] ※b_idはB.idの外部キー B [id, name, c_id] ※c_idはC.idの外部キー C [id, name] (クエリ) select A.name, B.name, C.name from A left join B on (A.b_id = B.id) left join C on (B.c_id = C.id) ---- どうやったらうまく取得できますか?もしくはできないのでしょうか? ご存知の方、ご教授ください。

    • ベストアンサー
    • MySQL
  • 外部結合に条件をつけたい

    oracle初心者です。 表A:ID、氏名 表B:ID、入社年、給与 上の表A,Bを、表Aを左辺にしてLEFT JOINする場合に、単純な外部結合では無く、 入社年が2000年以降の表Bのみ結合したい時のSQL文ですが、 select * from 表A LEFT JOIN 表B ON 表A.ID=表B.ID where 表B.入社年 > 2000 または、 select * from 表A,表B where 表A.ID=表B.ID(+) and 表B.入社年 > 2000 のように記述して実行すると、内部結合になってしまいます。 これを(外部結合として)実現するには、どのように記述すればよいでしょうか? 宜しくお願いいたします。

  • テーブル結合の件

    今回以下の内容を mysql Client API version 3.23.49 PHP/4.4.5 で動作させようと思っています。 sqlに関してあまり理解していません。 table member id name local 1 yamada saga 2 kawasaki osaka 3 tanaka miyagi 4 ozawa aomori table net id watch bag price day 1 2 0 \10,000 12/3 3 1 2 \50,000 12/6 1 0 3 \60,000 12/9 4 1 0 \15,000 12/15 table shop id watch bag price day 3 5 1 \48,000 12/1 3 5 2 \80,000 12/6 1 3 3 \60,000 12/10 3 4 2 \50,000 12/12 1 5 3 \60,000 12/13 結果 id name local net shop 1 yamada saga 2 2 2 kawasaki osaka 0 0 3 tanaka miyagi 1 3 4 ozawa aomori 1 0 という契約にいたった件数を得たいのですがどうすればいいのでしょうか? SELECT a. * , count( b.id ) AS idcount1, count( c.feed_id ) AS idcount2 FROM member AS a LEFT JOIN net AS b ON a.feed_id = b.feed_id LEFT JOIN shop AS c ON a.feed_id = c.feed_id GROUP BY a.feed_id という形でやってみたのですが 片方のカウントがうまく表示できません。 どうすればいいのでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • 外部結合について

    SQL文で、 select・・・・(select・・・・・) a ・・ となっていて、このaを使ってjoinをしたいと思っているのですが、 select・・・・(select・・・・・) a From (a right join NAME b on a.CD=b.CD) right join c・・・・・・ としてしまうとエラーとなってしまいます。 このaの使い方がわかりません。 どなたかアドバイスお願いします。

  • 外部結合について

    SQL文で、 select・・・・(select・・・・・) a ・・ となっていて、このaを使ってjoinをしたいと思っているのですが、 select・・・・(select・・・・・) a From (a right join NAME b on a.CD=b.CD) right join c・・・・・・ としてしまうとエラーとなってしまいます。 このaの使い方がわかりません。テーブル名という訳ではないので・・。 どなたかアドバイスお願いします。

  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • 複数テーブルの結合

    マスターテーブル1つと、子テーブルが複数存在して子テーブルにはマスターテーブルのidを格納するフィールドがあり参照しなくなったときにはそのidを消去するといったデータベースがあったときにマスターIDごとに子テーブルのどれか1つでも参照していればカウントするみたいなSQLをつくりたいんですが select count(m.id) from master m inner join a on m.id = a.m_id inner join b on m.id = b.m_id inner join c on m.id = c.m_id group by m.id みたいなSQLだとAにデータが存在しなければB以降に存在しても期待した結果が出力されません。A、B、Cいずれかのm_idとマスター側のIDが等しければカウントするという出力をするためにはどのように書けばいいんでしょうか。 わかりづらい説明で申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 複数JOINしているとCOUNTが正しく取得できな

    LAMP環境で開発をしています。 SQL文でCOUNTを求める際に、まとめて結果を求めようとして上手く行きません。 状況としては以下です。 テーブルdはidをkeyにa,b,c3つのテーブルとjoinしています。 id = 1の場合、テーブルa,b,cにマッチするレコードがそれぞれに4個、1個、0個あります。 ひとつひとつを SELECT COUNT(CASE WHEN a.name IS null THEN 1 ELSE null END) as a_count FROM d INNER JOIN a ON a.id = d.id WHERE d.id = 1 として結果を求めると4,1,0と出るのですが、まとめて SELECT COUNT(CASE WHEN a.name IS null THEN 1 ELSE null END) as a_count, COUNT(CASE WHEN b.name IS null THEN 1 ELSE null END) as b_count, COUNT(CASE WHEN c.name IS null THEN 1 ELSE null END) as c_count FROM d INNER JOIN a ON a.id = d.id INNER JOIN b ON b.id = d.id INNER JOIN c ON c.id = d.id WHERE d.id = 1 とすると28,5,0という値が返されます。 どのように書けば正しい4,1,0を得られるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Accessで外部結合

    本来Access2002(+VB.NET2003)で開発しています。 Accessで外部結合したいのですが出来ません。 わからなかったので、Oracle10gExpressionEdutionで試してみました。 SQL> desc DVDデータ 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- DVDナンバー NOT NULL VARCHAR2(10) 収録ID1 VARCHAR2(6) 収録ID2 VARCHAR2(6) 収録ID3 VARCHAR2(6) 収録ID4 VARCHAR2(6) ワイドホワイト NUMBER(1) 焼込済 NUMBER(1) レーベルプリント済 NUMBER(1) バックアップ NUMBER(1) SQL> desc 収録データ 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- 収録ID NOT NULL VARCHAR2(6) 番組名 VARCHAR2(100) 収録日 DATE 収録ステータス NUMBER(1) メモ VARCHAR2(100) のテーブル構造で select d.DVDナンバー , decode(d.ワイドホワイト , 0 , 'TRUE' , 1 , 'False' ), s.番組名 , s.収録日 , s2.番組名 , s2.収録日 , s3.番組名 , s3.収録日 , s4.番組名 , s4.収録日 from DVDデータ d join 収録データ s on s.収録ID = d.収録ID1 left outer join 収録データ s2 on s2.収録ID = d.収録ID2 left outer join 収録データ s3 on s3.収録ID = d.収録ID3 left outer join 収録データ s4 on s4.収録ID = d.収録ID4 order by 1 asc; をAccess2002のクエリで作成したいのですが、出来ません。 ※2行目のDecodeはAccessでは使えないので、 select d.DVDナンバー , d.ワイドホワイト, s.番組名 , s.収録日 , s2.番組名 , s2.収録日 , s3.番組名 , s3.収録日 , s4.番組名 , s4.収録日 from DVDデータ d join 収録データ s on s.収録ID = d.収録ID1 left outer join 収録データ s2 on s2.収録ID = d.収録ID2 left outer join 収録データ s3 on s3.収録ID = d.収録ID3 left outer join 収録データ s4 on s4.収録ID = d.収録ID4 order by d.DVDナンバー asc; ですかね。 Accessで上手く表示できるようにするにはどうしたらよいのでしょうか