Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.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_Sql_Sql Server_Database - Fatal编程技术网

Mysql 在本例中,如何从第一个表中查找第二个表中缺少的行?

Mysql 在本例中,如何从第一个表中查找第二个表中缺少的行?,mysql,sql,sql-server,database,Mysql,Sql,Sql Server,Database,我有两张桌子 表1:第一 -------------------------- | iso | WeldNo | -------------------------- | AMD-11201-01 | 02 | | RFG-11203-01 | 01 | | AMD-11201-01 | 03 | | RFG-11203-01 | 05 | 表2:第二 -------------------------- | iso

我有两张桌子

表1:第一

--------------------------
|  iso          | WeldNo |
--------------------------
| AMD-11201-01  |     02 |
| RFG-11203-01  |     01 |
| AMD-11201-01  |     03 |
| RFG-11203-01  |     05 |
表2:第二

--------------------------
|  iso          | WeldNo |
--------------------------
| AMD-11201-01  |     02 |
| RFG-11203-01  |     01 |
| RFG-11203-01  |     05 |
预期结果:

--------------------------
|  iso          | WeldNo |
--------------------------
| AMD-11201-01  |     03 |
我试过了,但没用

select a.iso, a.WeldNo 
from first a 
where a.WeldNo, a.iso not in (select b.iso,b.WeldNo from second b);
请给出我的方案的解决方案

select f.*
from first_table f
left join second_table s on s.iso = f.iso
                        and s.WeldNo = f.WeldNo 
where s.iso is null
也看到


另请参见问题标签中的

,不清楚您使用的是哪种RDBMS。如果您使用的是SQL Server,则可以使用:

这将从
SELECT
语句中选择所有项目,但在第二个
SELECT
语句中找到的项目除外

如果您使用的是MySQL,您可以稍微修改一下查询(即添加括号),您应该会得到一个正常的查询:

select a.iso, a.WeldNo 
from first a 
where (a.WeldNo, a.iso) not in (select b.WeldNo, b.iso from second b)

从这个问题的标签上看,不清楚您使用的是哪种RDBMS。如果您使用的是SQL Server,则可以使用:

这将从
SELECT
语句中选择所有项目,但在第二个
SELECT
语句中找到的项目除外

如果您使用的是MySQL,您可以稍微修改一下查询(即添加括号),您应该会得到一个正常的查询:

select a.iso, a.WeldNo 
from first a 
where (a.WeldNo, a.iso) not in (select b.WeldNo, b.iso from second b)

您可以使用
左连接
除外连接

左连接:

SELECT t1.iso, t1.WeldNo
FROM Table1 t1 
LEFT JOIN Table2 t2 ON t1.iso = t2.iso AND t1.WeldNo = t2.WeldNo
WHERE t2.iso IS NULL
SELECT iso, WeldNo
FROM Table1
EXECEPT
SELECT iso, WeldNo
FROM Table2
除外:

SELECT t1.iso, t1.WeldNo
FROM Table1 t1 
LEFT JOIN Table2 t2 ON t1.iso = t2.iso AND t1.WeldNo = t2.WeldNo
WHERE t2.iso IS NULL
SELECT iso, WeldNo
FROM Table1
EXECEPT
SELECT iso, WeldNo
FROM Table2
但也有一些不同之处。在except的情况下,两个结果必须具有相同的列,而
左联接允许您指定从每个表中选择的内容。而且,在大多数情况下,
左连接
的性能会更好,因为它会得到更好的优化。但是,
EXCEPT
只会从第一个查询返回第二个查询中缺少的唯一行,因此它可能更适用于这种情况。当然,您可以在第一个查询中添加一个
DISTINCT
,以获得类似的结果:

SELECT DISTINCT t1.iso, t1.WeldNo
FROM Table1 t1 
LEFT JOIN Table2 t2 ON t1.iso = t2.iso AND t1.WeldNo = t2.WeldNo
WHERE t2.iso IS NULL

综上所述,可能最好使用
左连接
,但它可能因数据库而异。

您可以使用
左连接
之外的其他连接

左连接:

SELECT t1.iso, t1.WeldNo
FROM Table1 t1 
LEFT JOIN Table2 t2 ON t1.iso = t2.iso AND t1.WeldNo = t2.WeldNo
WHERE t2.iso IS NULL
SELECT iso, WeldNo
FROM Table1
EXECEPT
SELECT iso, WeldNo
FROM Table2
除外:

SELECT t1.iso, t1.WeldNo
FROM Table1 t1 
LEFT JOIN Table2 t2 ON t1.iso = t2.iso AND t1.WeldNo = t2.WeldNo
WHERE t2.iso IS NULL
SELECT iso, WeldNo
FROM Table1
EXECEPT
SELECT iso, WeldNo
FROM Table2
但也有一些不同之处。在except的情况下,两个结果必须具有相同的列,而
左联接允许您指定从每个表中选择的内容。而且,在大多数情况下,
左连接
的性能会更好,因为它会得到更好的优化。但是,
EXCEPT
只会从第一个查询返回第二个查询中缺少的唯一行,因此它可能更适用于这种情况。当然,您可以在第一个查询中添加一个
DISTINCT
,以获得类似的结果:

SELECT DISTINCT t1.iso, t1.WeldNo
FROM Table1 t1 
LEFT JOIN Table2 t2 ON t1.iso = t2.iso AND t1.WeldNo = t2.WeldNo
WHERE t2.iso IS NULL

尽管如此,使用
左连接可能更好,但它可能会因数据库而异。

我会使用
不存在
,因为它清楚地表达了意图,即“从表1中选择表2中不存在具有相同iso和WeldNo的行的所有行”


我会使用
不存在
,因为它清楚地表达了意图,即“从表1中选择所有行,其中表2中不存在具有相同iso和WeldNo的行”


那么,您使用的是MySQL还是SQL Server?您的查询几乎准备好了。用
修复它。。其中(a.iso,a.WeldNo)不在..
(这是针对MySQL的。不知道它是否在sql server上工作)。我支持dotnetom的问题。您对通用SQL、MySQL或SQL Server有什么要求?您真的不应该同时标记mysql和sql server,除非您正在谈论在它们之间移植数据库或其他东西。因此,如果是通用SQL,则删除MySQL和SQL server。如果它是关于一个特定的数据库,那么你使用的是MySQL还是SQL Server?你的查询差不多准备好了。用
修复它。。其中(a.iso,a.WeldNo)不在..
(这是针对MySQL的。不知道它是否在sql server上工作)。我支持dotnetom的问题。您对通用SQL、MySQL或SQL Server有什么要求?您真的不应该同时标记mysql和sql server,除非您正在谈论在它们之间移植数据库或其他东西。因此,如果是通用SQL,则删除MySQL和SQL server。如果它是关于某个特定数据库的,那么选择它。在第二个查询中,您的列顺序是不同的
a.WeldNo,a.iso
b.iso,b.WeldNo
@PaulSpiegel感谢您的注意,修复了它这里的任何查询都无效。@user3041016您有错误吗?意外的结果?其他东西不起作用吗?在第二个查询中,列顺序不同
a.WeldNo,a.iso
b.iso,b.WeldNo
@PaulSpiegel感谢您的注意,修复了它这里的任何查询都无效。@user3041016您有错误吗?意外的结果?其他东西不起作用了吗?