Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql:从一个表中选择不在另一个表中的行_Mysql_Sorting_Unique_Database Table - Fatal编程技术网

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

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

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

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

存在
将帮助您…

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

例如,如果两个表都有一个
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);