web-dev-qa-db-ja.com

MySQL:別のテーブルにないテーブルから行を選択します

別のテーブルに表示されない1つのテーブルのすべての行を選択する方法

表1:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+

表2:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
+-----------+----------+------------+

Table2にないTable1の行の出力例:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+

たぶん、このような何かが動作するはずです:

SELECT * FROM Table1 WHERE * NOT IN (SELECT * FROM Table2)
100
user1006989

別のコメントで述べたように300列があり、すべての列で比較したい場合(列がすべて同じ名前であると仮定)、NATURAL LEFT JOINを使用して、2つのテーブル間で一致するすべての列名で暗黙的に結合できます。すべての結合条件を退屈に手動で入力する必要はありません。

SELECT            a.*
FROM              tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE             b.FirstName IS NULL
86
Zane Bien

*ではなく、列名に基づいて副選択を行う必要があります。

たとえば、両方のテーブルに共通のidフィールドがある場合、次のようにできます。

SELECT * FROM Table1 WHERE id NOT IN (SELECT id FROM Table2)

その他の例については、 MySQLサブクエリ構文 を参照してください。

160
Stennie
SELECT *
FROM Table1 AS a
WHERE NOT EXISTS (
  SELECT *
  FROM Table2 AS b 
  WHERE a.FirstName=b.FirstName AND a.LastName=b.Last_Name
)

EXISTSが役立ちます...

33
Ruzbeh Irani

標準のLEFT JOINで問題を解決でき、結合のフィールドにインデックスが付けられている場合
も高速になります

SELECT *
FROM Table1 as t1 LEFT JOIN Table2 as t2 
ON t1.FirstName = t2.FirstName AND t1.LastName=t2.LastName
WHERE t2.BirthDate Is Null
31
Steve

試してください:

SELECT * FROM table1
    LEFT OUTER JOIN table2
    ON table1.FirstName = table2.FirstName and table1.LastName=table2.LastName
    WHERE table2.BirthDate IS NULL
6
Sachin Pundir

この簡単なクエリを試してください。完璧に機能します。

select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);
2
Vijesh

これはOracleで私のために働いた:

SELECT a.* 
    FROM tbl1 a 
MINUS 
SELECT b.* 
    FROM tbl2 b;
0