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

107 mysql sorting unique database-table

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

表格1:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+
Run Code Online (Sandbox Code Playgroud)

表2:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Tia       | Carrera  | 1975-09-18 |
| Nikki     | Taylor   | 1972-03-04 |
+-----------+----------+------------+
Run Code Online (Sandbox Code Playgroud)

Table1中不在Table2中的行的示例输出:

+-----------+----------+------------+
| FirstName | LastName | BirthDate  |
+-----------+----------+------------+
| Yamila    | Diaz     | 1972-03-04 |
+-----------+----------+------------+
Run Code Online (Sandbox Code Playgroud)

也许这样的事情应该有效:

SELECT * FROM Table1 WHERE * NOT IN (SELECT * FROM Table2)
Run Code Online (Sandbox Code Playgroud)

Ste*_*nie 167

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

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

SELECT * FROM Table1 WHERE id NOT IN (SELECT id FROM Table2)
Run Code Online (Sandbox Code Playgroud)

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

  • 但是,如果我们谈论大数据呢?例如,Table2包含100M行? (3认同)
  • 请注意,如果您在Table2中查看的列包含空值,则它将始终返回空集.如果您是基于主键执行此操作,则不是问题,但与尝试在其他上下文中使用此查询的人员相关. (2认同)

Zan*_*ien 88

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

SELECT            a.*
FROM              tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE             b.FirstName IS NULL
Run Code Online (Sandbox Code Playgroud)

  • 如果您有300列,则应重新设计数据库. (71认同)

Ruz*_*ani 38

SELECT *
FROM Table1 AS a
WHERE NOT EXISTS (
  SELECT *
  FROM Table2 AS b 
  WHERE a.FirstName=b.FirstName AND a.LastName=b.Last_Name
)
Run Code Online (Sandbox Code Playgroud)

EXISTS 会帮助你...

  • 很好的答案,对于大型数据集很经济,谢谢。 (4认同)
  • 强的。大型数据集的最佳答案 (2认同)

Ste*_*eve 32

标准的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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但如果表有300列怎么办? (2认同)
  • 这是一个了不起的答案,因为它不需要返回“Table2”的所有行! (2认同)

Vij*_*esh 8

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

select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);
Run Code Online (Sandbox Code Playgroud)


Sac*_*dir 6

尝试:

SELECT * FROM table1
    LEFT OUTER JOIN table2
    ON table1.FirstName = table2.FirstName and table1.LastName=table2.LastName
    WHERE table2.BirthDate IS NULL
Run Code Online (Sandbox Code Playgroud)