• ベストアンサー
  • 困ってます

差集合について

MYSQL5.5について質問です。 Table1.idからTable2.idを引いて差集合を得たいとと思います。 例えば、 Table1.id 001 002 003 004 Tbale2.id 002 003 004 とあれば、最終的に欲しい結果は 001 のみです。 SQLを書くと下記のようなSQLになると思います。 mysql> SELECT table1.* FROM table1 -> LEFT JOIN table2 ON table1.id=table2.id -> WHERE table2.id IS NULL; しかし、これで差集合が得られるのかわかりません。 left joinして、table2 is nullにすれば、差集合に なるか教えて頂けますでしょうか? また、not existsで代用できるみたいですが、その場合、 どのようなSQLを書けばよいでしょうか?

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

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

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

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

Table1.id、Table2.idともに主キーならLEFT JOINで差集合が得られます。 しかし Table2のidに重複があるような場合 002 002 003 004 結合の際に複数行を生じてしまいます。 より一般的にするのなら SELECT table1.* FROM table1 LEFT JOIN ( select distinct id frpm table2 ) t2 ON table1.id=t2.id WHERE t2.id IS NULL; になります。 NOT EXISTSを使うなら SELECT * FROM TABLE1 WHERE NOT EXISTS ( SELECT 1 FROM TABLE2 WHERE TABLE1.ID=TABLE2.ID ) になります。 この場合、TABLE2のIDにINDEXがあると有効になる場合が多いです。

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

質問者からのお礼

勉強になります!ありがとうございます!!

関連するQ&A

  • MYSQLの差集合について

    MYSQLの差集合について MYSQLの差集合についてお教えください。OracleにはMinus、Postgres等はexceptがあります。MYSQLで同等の関数がないか調べましたが、無いのか検索がヘタなのかヒットしません。下記のようにSQLを書けばexceptと同じ効果があるのはわかりますが、exceptみたいにかけたら簡単かなと思います。そのような関数がありましたら、お教えください。よろしくお願い致します。 mysql> SELECT table1.* FROM table1 -> LEFT JOIN table2 ON table1.id=table2.id -> WHERE table2.id IS NULL;

    • ベストアンサー
    • MySQL
  • distinct をexistsに変換する

    distinctをexistsに変換した方がパフォーマンスが良いようで、 例えば以下の例があるとします ---------------------------------- (前)SELECT DISTINCT a.ID1, a.NAME1 FROM TABLE1 a, TABLE2 b WHERE a.ID1 = b.ID2 (後)SELECT a.ID1, a.NAME1 FROM TABLE1 a    WHERE EXISTS ( SELECT 'X' FROM TABLE2 b WHERE a.ID1 = b.ID2) ---------------------------------- もっと複雑なSQLの場合、EXISTSに変換できるのでしょうか?。複雑なSQLとは、 「複数のテーブルからカラムを取得」「テーブル結合が2つ以上」「外部結合」 などのSQLで、以下に例を示します。 (例)SELECT DISTINCT a.ID1,a.NAME1,b.ID2,b.NAME2,c.ID3,c.NAME3    FROM TABLE1 a,TABLE2 b,TABLE3 c    WHERE a.ID1 = b.ID1(+)      AND a.ID1 = c.ID1(+)

  • 複数の外部結合

    こんにちは、外部結合の仕方についてお聞きしたいのですが、 このSQL1で抽出されたデータにさらに TABLE3テーブルのデータを追加したくSQL2を作成したのですが、 うまくいきません。 ON TABLE1.[Code]=TABLE3.[Code]の部分をどのように記述すればよいのでしょうか? SQL1--------- TABLE1.[tamp] [Child], TABLE2.* FROM [p].[Price] TABLE1 LEFT OUTER JOIN [p].[Receive] TABLE2 ON TABLE2.[Code]=TABLE1.[Code] SQL2---------- TABLE1.[tamp] [Child], TABLE2.*, TABLE3.* FROM [p].[Price] TABLE1 LEFT OUTER JOIN [p].[Receive] TABLE2 ON TABLE2.[Code]=TABLE1.[Code] LEFT OUTER JOIN [p].[Product] TABLE3 ON TABLE1.[Code]=TABLE3.[Code]

その他の回答 (1)

  • 回答No.2
  • a_ka_
  • ベストアンサー率16% (1/6)

select Table1.id from Table1 minus select Table2.id from Table2; とか?

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

関連するQ&A

  • ACCSESSのクエリについて教えてください

    すみません! SQL初心者なのですがクエリについておしえてください。 table1 id kigou 1 a 2 b 3 c 4 d 5 e table2 id kigou 1 a 2 b 3 cc 4 ee 上記の2テーブルよりkigouのc d eが含まれるデータを抽出して kigouの1桁目が同じもののidを合計する場合、どのような 構文になりますでしょうか。。 以下のように記載しましたが、その後どうすればよいかわかりません。 select * from table1 left join table2 on table1.id=table2.id where table1.kigou in ('c','d','e') or table2.kigou in ('c','d','e') そもそもアプローチの仕方が間違っているのでしょうか。。

  • JOINを使った文で、date > now();

    質問、失礼いたします。 PHP+MySQLでページを作成しています。 JOINを使って、2つのテーブルを表示しています。 その際に、「明日以降」という条件で絞り込みをしたいのですが、 【 AND date > now(); 】 という指定が上手く反映されません。 SQL文 SELECT table1.*, table2.kaijou, table2.cd, table2.member FROM table1 JOIN table2 ON table1.id = table2.id WHERE word LIKE '%東京%' OR word LIKE '%大阪%' AND date > now(); wordの条件は反映されています。 phpMyAdminの方から、直接SQL文を実行しても同じ結果だったので、 MySQLの方の接続は問題ございませんでした。 ご存じの方、宜しければご教授お願い致します。

    • ベストアンサー
    • PHP
  • LEFT OUTER 外部結合で一致しない値も表示

    select table1.*, table2.no from table1 inner left outer join table2 on table1.id = table2.no 上記の文を使って、一致した値がなくても、 すべて表示させた表を完成させたいのですが、 エラー #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'left outer join table2 on table1.id = table2.no~ が出てしまいます。 何がいけないのか、LEFT OUTERなしでやってみると、 きちんと値が返ってきました。 詳しい方いらっしゃいましたら、どうかお知恵を貸してください。 お願いいたします。

    • ベストアンサー
    • MySQL
  • ASP + SQLにて

    お世話になっております。 このたびASPを使用し、SQL Serverへデータをいれ管理プログラムを作成しているのですが、一部データの取り出しがわからないのでご質問させていただきます。 SQL文を発行する際に、 strSQL = "select * from table1 left join table2 on table1.社員ID = table2.ID order by table1.ID desc" としております。 構造として table1にはID,日付,内容,社員IDがありまして table2にはID,社員名があります。 上記のSQL文を実行し、 <% response.write objRS("社員名") %> として社員名を出力しているのですが、 そのときtable1のIDを出力しようとして <% response.write objRS("ID") %> としたらtable2のIDが出力されてしまいました。 table1のIDを出力する方法はないのでしょうか? よろしくお願いいたします。

  • 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
  • 複数のテーブルを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です。 よろしくお願いいたします。

  • SQL 外部結合について

    EXCELでODBC接続で外部データを取り込み、クエリテーブルを作成するところまではできるのですが、MicrosoftQueryを使って外部結合をしようとすると、テーブルが3個以上ある場合は外部結合できませんとエラーが表示されます。 直接SQLをさわれば出来るのかと思い、 SELECT フィールド名1, フィールド名2, ... FROM (((TABLE1 LEFT JOIN TABLE2 ON TABLE1.NO = TABLE2.NO)LEFT JOIN TABLE3 ON TABLE1.NO = TABLE3.NO)LEFT JOIN TABLE4 ON TABLE1.NO = TABLE4.NO)LEFT JOIN TABLE5 ON TABLE1.NO = TABLE5.NO を入力したのですが、「ORA-00942: 表またはビューが存在しません」というエラーが発生しました。 いろいろ調べてみたのですが全くの初心者なもので本当に困っております。 どなたかアドバイス等よろしくお願いします。

  • MySQL + PHP での自動採番

    関連する本を買い込みましたが、全然情報がないのでご助言下さい! 複数テーブルから文字列を抽出してIDを振るような入力フォームを作っています。 具体的には以下のような形を考えているのですが、どのように記述をしてよいのかさっぱりです・・・。 table1: +-----+-------------+------+------+-- | ID0 | ID1 | col1 | col2 | +-----+-------------+------+------+-- | 1 | KW0807-0001 | A | 3323 | | 2 | KX0807-0002 | B | 1122 | | 3 | KY0807-0003 | C | 4441 | | 4 | KW0807-0004 | A | 1256 | +-------------------+------+------+-- table2: +-----+------+------+-- | ID2 | col3 | col4 | +-----+------+------+-- | 1 | A | W | | 2 | B | X | | 3 | C | Y | | 4 | D | Z | +-----+------+------+-- ・ID0 は AUTO INCREMENT ・ID1 -> [K(規定値)] + [col1で入力する値よりcol4を抽出] + 入力した年 (08) + 入力した月 (07) + 0001 から始まる4桁の連番 ・col1, col2の入力と同時に、ID1 を自動で生成、入力 (table2は既存です) ひとまずこんな感じかな・・・と書いてみましたが、全然ダメです。 ID1の入力値は「KResource id #30807-」となってしまいました。 $y = date("y",time()); $m = date("m",time()); $renban = mysql_query(" select col4 from table1 INNER JOIN table2 //LEFT JOINでも可? ON col1.table1 = col3.table2 where '$col1' = col3 "); $ID1 = "K$renban$y$m-0000"; $sql = "insert into table1 values('$ID1', '$col1' '$col2'); ※4桁の連番もどうしてよいか分からないので、ひとまず「0000」としました。 何が足りないのか誤ってるのか・・・ご教授いただければ幸いです。

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

    SQL Sever 2005 を利用しております。5つのテーブルから値を取得するSQL文を作成したいと考えております。3つまでのテーブルのFULL OUTER JOIN は例がるのですがそれ以上となると調べても判りませんでした。ご教授お願い致します。 TABLE1&#65374;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

  • 2つのテーブルの結合に関してです

    お世話になります PHP5,MySql5.0.33にて開発を行っています 2つのテーブルの結合部分で困っています TABLE1 ---------------------------------- ID DATE1 DATE2  COUNT ---------------------------------- 1  2/27  2/20  10 2  2/27  2/20  10 ---------------------------------- TABLE2 ---------------------------------- ID DATE1 DATE2 COUNT ---------------------------------- 1  2/21  2/26  5 2  2/21  2/27  5 ---------------------------------- 上記2つのテーブル(TABLE1/TABLE2)から TABLE1のDATE1=2/27より過去の行とTABLE2のDATE2=2/27より過去の行を 取得したいのですが上手くいかず…(下SQLで記述しています) SELECT DISTINCT TABLE1.* FROM TABLE1,TABLE2 WHERE TABLE1.ID=TABLE2.ID AND TABLE1.ID=1 AND (TABLE1.DATE1<='2009/2/27' OR TABLE2.DATE2<='2009/2/27') (結合のそもそもの理解が間違っているかも知れませんが…;) 宜しくお願いします

    • ベストアンサー
    • MySQL