154

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

表格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 |
+-----------+----------+------------+

表 1 中不在表 2 中的行的示例输出:

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

也许这样的事情应该工作:

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

9 回答 9

213

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

例如,如果您有id两个表共有的字段,您可以这样做:

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

有关更多示例,请参阅MySQL 子查询语法

于 2012-08-01T21:12:02.887 回答
116

如果您在另一条评论中提到了 300 列,并且您想要比较所有列(假设列都是相同的名称),您可以使用 aNATURAL LEFT JOIN隐式连接两个表之间的所有匹配列名,以便您不必繁琐地手动输入所有连接条件:

SELECT            a.*
FROM              tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE             b.FirstName IS NULL
于 2012-08-01T22:12:50.210 回答
66
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会帮助你...

于 2012-08-01T21:07:23.650 回答
39

一个标准的 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
于 2012-08-01T21:21:11.957 回答
11

试试这个简单的查询。它完美地工作。

select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);
于 2017-10-30T16:58:56.320 回答
8

尝试:

SELECT * FROM table1
    LEFT OUTER JOIN table2
    ON table1.FirstName = table2.FirstName and table1.LastName=table2.LastName
    WHERE table2.BirthDate IS NULL
于 2014-12-08T11:58:43.270 回答
0

一个选项是

SELECT A.*
    FROM TableA as A
    LEFT JOIN TableB as B
    ON A.id = B.id
    Where B.id Is NULL
于 2021-11-24T13:46:33.123 回答
-3

这在 Oracle 中对我有用:

SELECT a.* 
    FROM tbl1 a 
MINUS 
SELECT b.* 
    FROM tbl2 b;
于 2017-02-07T12:16:19.907 回答
-7
SELECT a.* FROM 
FROM tbl_1 a
MINUS
SELECT b.* FROM 
FROM tbl_2 b
于 2015-06-16T18:52:04.873 回答