SQLで複数テーブルの不一致クエリを行う方法

このQ&Aのポイント
  • SQLで複数のテーブルから不一致データを抽出する方法について教えてください。
  • テーブルAとテーブルB、テーブルCに同じコードが振られています。
  • これらのテーブルのうち、いずれかのテーブルに存在しないコードを抜き出したいです。
回答を見る
  • ベストアンサー

複数テーブルの不一致クエリについて

SQLで、下記selectを行いたいです。 テーブルA テーブルB テーブルC これら三つのテーブルには、同一のコードが振られています。 この三つのテーブルのひとつにでも、抜けているコードを抜き出したいです。 (テーブルAのコード=テーブルBのコード=テーブルCのコードになっていないコード) 例) テーブルAに入ってるコード(1.3.5) テーブルBに入っているコード(1.4.5) テーブルCに入っているコード(1.5.6) このとき、三つのテーブルにきちんと入っているコードは、1と5だけなので、それ以外のコードを抜き出す→3.4.6 これをSQLで行う場合、簡単なSQL文はありますでしょうか? 今、考えているのは、各テーブルすべてをinner joinしたviewを作成し(これにより三つとも入ってるコードの一覧ができる)、 そのviewと、テーブルA、テーブルB、テーブルCそれぞれをひとつづつleft joinして、不一致データを取り出す方法です。 でも、そうすると、viewを作成しなくてはいけず、また、SQLをテーブルの数分(今回は3回)投げなくてはいけなくて。。 もっと、単純にかけないものでしょうか? ご存知の方、教えてください。

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

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

RDBMSは、SQL Serverなのですね? 2000ですか?2005ですか? バージョンにより、せっかく具体的なSQLを提示しても、質問者さんの環境では動かせない場合があります。 以下のSQLを試してみてください。2005なら動くと思います。 2000なら、インラインビュー(「select ~ from (select ~ from ~)」という記述)が、使えないかも知れません。 select * from(select c1 from A union select c1 from B union select c1 from C) as x where not exists (select * from A,B,C where A.c1=B.c1 and B.c1=C.c1 and x.c1=A.c1)

ankomaki
質問者

お礼

ありがとうございます。 早速試してみました。 きちんと値が返ってきました! あとは、負荷状況とかを確認して、つかえそうでしたら、使わせていただきます。 早速ご回答いただき、本当にありがとうございました。 P.S ちなみに、2005です。

関連するQ&A

  • ACCESSクエリで複数テーブルの値の結合について

    現在、ACCESS2000で2つのテーブルの値を表示するクエリを作成中です。 テーブルは外部データよりインポートしています。 Aテーブル KEY1 | KEY2 | 値1 -------------------------- 00000001 | AAAAAAAA | 100 00000001 | BBBBBBBB | 200 00000002 | AAAAAAAA | 1000 Bテーブル KEY1 | KEY2 | 値1 -------------------------- 00000001 | AAAAAAAA | 500 00000002 | BBBBBBBB | 300 これを、 KEY1 | KEY2 | 値1 ------------------------------------------------ 00000001:00000001 | AAAAAAAA:AAAAAAAA | 100:500 ←(1) 00000001:NULL | BBBBBBBB:NULL | 200:NULL ←(2) 00000002:NULL | AAAAAAAA:NULL | 1000:NULL ←(3) NULL:00000002 | NULL:BBBBBBBB | NULL:300 ←(4) と表示したいのです。 INNER JOIN では、上記(1)しか表示されません。 また、LEFT JOIN では、(1)(2)(3)は表示されますが、(4)が表示されません。 SQLは下記です(INNER JOINを使用した場合) SELECT [Aテーブル.KEY1] & ":" & [Bテーブル.KEY1] AS KEY1, [Aテーブル.KEY2] & ":" & [Bテーブル.KEY2] AS KEY2, [Aテーブル.値1] & ":" & [Bテーブル.値1] AS 値1 FROM Aテーブル INNER JOIN Bテーブル ON ([Aテーブル].[KEY1]=[Bテーブル].[KEY1]) AND ([Aテーブル].[KEY2]=[Bテーブル].[KEY2]); どなかた教えてください。お願いします。

  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどで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 よろしければアドバイスお願いします。

  • 複数テーブルを結合するには?

    OS:WINDOWSXP SP2 ORACLE:Oracle9i Enterprise Edition Release 9.2.0.1.0 A, B, Cというテーブルがあるとします。 それぞれのテーブルには XXカラムと YYカラムがあるとします。 2つのテーブルを結合させるには、以下のSQL文を記述すれば良いと考えています。 SELECT A.*,B.* FROM A JOIN B ON A.XX = B.XX 3つのテーブルを結合するには、以下のSQL文を記述しています。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX JOIN C ON A.XX = C.XX 但し、この記述方法でいきますと、Cテーブルを右側外部結合に指定した場合のみ、 ORA-00904 "C" 無効な識別子です。 というエラーメッセージが表示されます。 SELECT A.*,B.*,C.* FROM A JOIN B ON A.XX = B.XX RIGHT OUTER JOIN C (←LEFT OUTER、FULL OUTER)なら通ります) ON A.XX = C.XX 何故、右側外部結合のみ不正となるのか不明であり、解決策が見つかりません。 複数のテーブルを結合する為のSQL文の記述方法を教えて頂けますでしょうか?

  • 複数テーブルの結合

    マスターテーブル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
  • MySQL複数テーブルからの情報取得に関しまして

    Aテーブル...ユーザ情報 Bテーブル...商品情報(AテーブルのユーザIDを列として持っています) Cテーブル...アイテム情報(Bテーブルの商品IDを列として持っています) Bテーブルの一覧リスト表示の画面にて、検索項目として、 Aテーブルのユーザ名、Cテーブルのアイテム名があります。 現在は、LEFT JOINを使って、検索、呼び出しを行っておりますが、 多数のカラムを指定して呼び出しを行っているため、SQL文が長くなってしまっており、 もっとすっきりとしたSQL文を記述したいと考えております。 ※Aテーブル,Bテーブルの組み合わせは他の画面でもよく使われております。 viewという機能を使うことによって、これをすっきりと記述できるようになるのではないかと考えておりますが、viewはこのような使い方をしてもいいのでしょうか。 または、もっとすっきりとした記述を行う技術のアドバイスをお願いいたします。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 列の一部が追加できないクエリについて

    現在社内の顧客管理をAccessで行おうとして、まずはAccess2003にてスタンドアロンで顧客管理システムを作成し、アップサイジングウィザードを使用してSQL Server Express Editionへテーブル情報をコピーし、テーブルのリンクにて接続する状態まで来たのですが、とあるクエリで新たにレコードを追加する際に一部の列の変更が出来ないと言った現象が発生しています。既に存在している情報については問題なく変更出来ます。テーブル情報をSQL Serverにコピーする以前(mdbの状態)では正常に追加出来ていました。 問題のクエリの構成ですが、 テーブルA、テーブルB、テーブルC、テーブルD共に顧客コード(KOKYAKU_CODE)を主キーにしており、 テーブルAの顧客コード、会社名 テーブルBの○○フラグ、△△フラグ テーブルCの××コード テーブルDの□□コード を表示するようなクエリとなります。 SQLビューでFROM部分を確認すると、 「FROM ((テーブルA INNER JOIN テーブルB ON テーブルA.KOKYAKU_CODE = テーブルB.KOKYAKU_CODE) INNER JOIN テーブルC ON テーブルA.KOKYAKU_CODE = テーブルC.KOKYAKU_CODE) INNER JOIN テーブルD ON テーブルA.KOKYAKU_CODE = テーブルD.KOKYAKU_CODE;」 となっています。 このうち、新規レコード追加時にテーブルB、テーブルC、テーブルDの情報の書き換えが出来ない状態です。 恐らくリレーションの設定がおかしい為にこの様な現象になっているのだとは思うのですが、mdbの状態(アップサイジングウィザード実行前)では問題ない事や、SQL Serverのダイヤグラム等が関係しているのかがよく分からずにいます。 すみませんが助言をお願い致します。

  • 複数のテーブルをJOINして更新する方法

    複数のTABLEをJOINさせてアップデートをしたいと思っています。 TABLE1とTABLE2のCODEはJOINができます。 TABLE1とTABLE3のJANはJOINができます。 TABLE2にはJANフィールドがありません。 TABLE3のSTOCKをTABLE2のSTOCKに代入したいと思います。 以上の条件により下記のSQLを作って見ました。 UPDATE (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN SET TABLE2.STOCK = TABLE3.STOCK WHERE TABLE1.FLAG=0 本を読んでみると、SELECT文による複数のテーブルからデータを引っ張ってくる例は載っているのですが、複数のTABLE情報を元にUPDATEする例は載っていませんでした。上記のようなコードはあっているでしょうか?利用している環境はWin XP Pro、MYSQL 5.5です。 よろしくお願いいたします。

  • 2つのテーブルから条件に一致しないデータ抽出

    2つのテーブルから条件に一致しない行のみ抜き出しCSV か他のテーブルに抜き出す処理を作ろうと思っています。 そこで質問なのですが、以下の2つのテーブルから 条件に一致しないコードのみ抜き出すSQL文などありますか? ----------------------------------------- マスターテーブル コード、ネーム1、ネーム2、店コード 1、あ、い、6 2、う、え、8 3、お、か、4 4、き、く、2 店コードテーブル 店コード、店区分 1、スーパー 2、コンビニ 3、デパート 4、ホームセンター ------------------------------------------ 条件は、マスターテーブルの店コードが店コードテーブルに存在 しないデータのみ抽出です。 抽出結果は、以下の様にしたいです。 1、あ、い、6 2、う、え、8 このような考え大丈夫でしょうか? SELECT * FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S ON M.店コード = S.店コード わかりずらい質問ですがよろしくお願いします。

  • 固定値を含む結合と複数テーブルの結合について

    「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。

  • left outer joinで抽出したい

    SELECT (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN というSQL文があります。この文を変更して下記の条件での抽出をおこないたいと思います。 ■TABLE1.JANを元にする。 ■TABLE1.JAN = TABLE3.JANは抽出に含めない ■TABLE1.JANに存在していて、TABLE3.JANに存在しないJANをTABLE1.JANから抽出 このようなSQL文をかきたいのですが、どのようなSQL文にしたらよいでしょうか? left outer joinを使えばいいとは思うのですが、そこから先が思い浮かびません。 よろしくお願いします。

    • ベストアンサー
    • MySQL