Mysql:从一个表中选择不在另一个表中的行
如何选择一个表中未出现在另一个表中的所有行 表1:Mysql:从一个表中选择不在另一个表中的行,mysql,sorting,unique,database-table,Mysql,Sorting,Unique,Database Table,如何选择一个表中未出现在另一个表中的所有行 表1: +-----------+----------+------------+ | FirstName | LastName | BirthDate | +-----------+----------+------------+ | Tia | Carrera | 1975-09-18 | | Nikki | Taylor | 1972-03-04 | | Yamila | Diaz | 1972-03-0
+-----------+----------+------------+
| 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)
存在
将帮助您…您需要根据列名而不是*
进行子选择
例如,如果两个表都有一个id
字段,则可以执行以下操作:
SELECT * FROM Table1 WHERE id NOT IN (SELECT id FROM Table2)
有关更多示例,请参阅。标准的左联接可以解决此问题,如果联接上的字段已编制索引,
也应该更快
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
如果您在另一条注释中提到有300列,并且您希望对所有列进行比较(假设所有列的名称都相同),则可以使用
自然左联接
对两个表之间的所有匹配列名进行隐式联接,这样您就不必繁琐地手动键入所有联接条件:
SELECT a.*
FROM tbl_1 a
NATURAL LEFT JOIN tbl_2 b
WHERE b.FirstName IS NULL
尝试:
这对我在甲骨文公司很有用:
SELECT a.*
FROM tbl1 a
MINUS
SELECT b.*
FROM tbl2 b;
试试这个简单的查询。它工作得很好
select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);
谢谢你的澄清!但是我真的不需要根据任何字段来选择行,因为我对行中任何字段的任何变化都感兴趣……如果只有几个列可以比较,那么可以按照@Steve的示例进行连接。如果您实际要求对两个具有多个列的表中的数据进行常规比较,则可能需要查找一个。请注意,如果您在表2中查看的列包含null,则这将始终返回一个空集。如果您是基于主键进行查询,这不是一个问题,但是与尝试在其他上下文中使用此查询的人员相关。但是如果我们谈论的是大数据呢?例如,表2包含100万行?聪明的答案。谢谢,好吧,我想一定是这样,顺便说一句,为什么t2.Birthdate是空的而不是t1.Birthdate=t2.Birthdate?因为如果你加上它,那么每一行都会被返回,你说在输出中应该只显示不在第二个表中的行这是一个很好的答案,因为它不需要返回表2的所有行!我同意,回答得很好。我在4个表之间有一个多表,将AND放入内部联接肯定会更经济。回答好,对于大数据集来说更经济,谢谢。Strong。对于大型DataSetsHanks来说,这是最好的答案,它帮助我注意到,只有在所有列都没有空值的情况下,这才可以按预期工作。在MySQL中为空!=NULL,因此即使第二个表中有重复的行,也将返回具有NULL值的每一行。如果有300列,则应重新设计数据库。嘿,这对我也有效,谢谢!但是,如果行数大于300,这会是一个问题吗?顺便说一句,我仍然对查询感到困惑。例如,如果我将“where b.FirstName is null”更改为“where b.LastName is null”,会怎么样?有什么区别?很抱歉问这个问题,我还是sql的新手:D这个问题是关于MySQL的。
SELECT a.* FROM
FROM tbl_1 a
MINUS
SELECT b.* FROM
FROM tbl_2 b
SELECT a.*
FROM tbl1 a
MINUS
SELECT b.*
FROM tbl2 b;
select * from Table1 where (FirstName,LastName,BirthDate) not in (select * from Table2);