Mysql 在本例中,如何从第一个表中查找第二个表中缺少的行?
我有两张桌子 表1:第一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
--------------------------
| 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您有错误吗?意外的结果?其他东西不起作用了吗?