从表中选择不在另一个表中的行

问题描述 投票:0回答:11

如何选择一个表中未出现在另一个表中的所有行?

表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)
mysql sorting unique database-table
11个回答
237
投票

您需要根据列名称进行子选择,而不是

*

例如,如果您有两个表共有的

id
字段,您可以这样做:

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

请参阅MySQL子查询语法了解更多示例。


119
投票

如果您在另一条评论中提到有 300 列,并且想要比较所有列(假设这些列的名称都相同),则可以使用

NATURAL LEFT JOIN
隐式连接两个列之间的所有匹配列名称表格,这样您就不必手动输入所有连接条件:

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

80
投票
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
会帮助你...


44
投票

标准的 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

12
投票

尝试这个简单的查询。它运行完美。

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

10
投票

尝试:

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

2
投票

一个选项是

SELECT A.*
    FROM TableA as A
    LEFT JOIN TableB as B
    ON A.id = B.id
    Where B.id Is NULL

0
投票
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


0
投票

我知道这是一个较旧的问题,所以我想更新一个执行速度更快的方法。您可以利用 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 年前这个问题得到了回答,我不知道......


-3
投票

这在 Oracle 中对我有用:

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

-8
投票
SELECT a.* FROM 
FROM tbl_1 a
MINUS
SELECT b.* FROM 
FROM tbl_2 b
© www.soinside.com 2019 - 2024. All rights reserved.