別のテーブルに表示されない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)
別のコメントで述べたように300列があり、すべての列で比較したい場合(列がすべて同じ名前であると仮定)、NATURAL LEFT JOIN
を使用して、2つのテーブル間で一致するすべての列名で暗黙的に結合できます。すべての結合条件を退屈に手動で入力する必要はありません。
SELECT a.*
FROM tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE b.FirstName IS NULL
*
ではなく、列名に基づいて副選択を行う必要があります。
たとえば、両方のテーブルに共通のid
フィールドがある場合、次のようにできます。
SELECT * FROM Table1 WHERE id NOT IN (SELECT id FROM Table2)
その他の例については、 MySQLサブクエリ構文 を参照してください。
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
が役立ちます...
標準の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
試してください:
SELECT * FROM table1
LEFT OUTER JOIN table2
ON table1.FirstName = table2.FirstName and table1.LastName=table2.LastName
WHERE table2.BirthDate IS NULL
この簡単なクエリを試してください。完璧に機能します。
select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);
これはOracleで私のために働いた:
SELECT a.*
FROM tbl1 a
MINUS
SELECT b.*
FROM tbl2 b;