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

时间:2012-08-01 21:04:34

标签: mysql sorting unique database-table

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

表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)

8 个答案:

答案 0 :(得分:158)

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

例如,如果您有两个表共有的id字段,则可以执行以下操作:

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

有关更多示例,请参阅MySQL subquery syntax

答案 1 :(得分:85)

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

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

答案 2 :(得分:33)

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

答案 3 :(得分:31)

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

答案 4 :(得分:6)

尝试:

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

答案 5 :(得分:1)

尝试这个简单的查询。它运作得很好。

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

答案 6 :(得分:0)

这在Oracle中对我有用:

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

答案 7 :(得分:-4)

SELECT a.* FROM 
FROM tbl_1 a
MINUS
SELECT b.* FROM 
FROM tbl_2 b
相关问题