如何选择一个表中未出现在另一个表中的所有行?
表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 |
+-----------+----------+------------+
Table1 中不在 Table2 中的行的输出示例:
+-----------+----------+------------+
| FirstName | LastName | BirthDate |
+-----------+----------+------------+
| Yamila | Diaz | 1972-03-04 |
+-----------+----------+------------+
也许这样的事情应该有效:
SELECT * FROM Table1 WHERE * NOT IN (SELECT * FROM Table2)
您需要根据列名称进行子选择,而不是
*
。
例如,如果您有两个表共有的
id
字段,您可以这样做:
SELECT * FROM Table1 WHERE id NOT IN (SELECT id FROM Table2)
请参阅MySQL子查询语法了解更多示例。
如果您在另一条评论中提到有 300 列,并且想要比较所有列(假设这些列的名称都相同),则可以使用
NATURAL LEFT JOIN
隐式连接两个列之间的所有匹配列名称表格,这样您就不必手动输入所有连接条件:
SELECT a.*
FROM tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE b.FirstName IS NULL
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 where (FirstName,LastName,BirthDate) not in (select * from Table2);
尝试:
SELECT * FROM table1
LEFT OUTER JOIN table2
ON table1.FirstName = table2.FirstName and table1.LastName=table2.LastName
WHERE table2.BirthDate IS NULL
一个选项是
SELECT A.*
FROM TableA as A
LEFT JOIN TableB as B
ON A.id = B.id
Where B.id Is NULL
SELECT
table_A.column_1,
table_A.column_2,
table_A.email
FROM table_A
WHERE table_A.email
NOT IN ( SELECT table_B.email FROM table_B )
包含表 A 中的几列的示例。
表 A 和表 B 都有一个名为“电子邮件”的列。
查询结果中将省略表 B 中匹配的电子邮件。
(这个问题类似于 mysql select from table 1 where no match in table 2 )
我知道这是一个较旧的问题,所以我想更新一个执行速度更快的方法。您可以利用 WHERE NOT EXISTS...
SELECT number
FROM TableA
WHERE NOT EXISTS (SELECT number
FROM B
WHERE TableA.number = TableB.number);
虽然我没有靠近任何文档,但我怀疑“NOT EXISTS”指示MySQL搜索第一个查询一次,而“NOT IN”则让查询执行每条记录。在我的数据库中,“NOT EXIST”需要 0.3 秒才能返回 340,000 条记录,而“NOT IN”则需要 10 秒才能返回 100 条记录的限制。不存在可能不存在 12 年前这个问题得到了回答,我不知道......
这在 Oracle 中对我有用:
SELECT a.*
FROM tbl1 a
MINUS
SELECT b.*
FROM tbl2 b;
SELECT a.* FROM
FROM tbl_1 a
MINUS
SELECT b.* FROM
FROM tbl_2 b