2016-04-24 75 views
1

我有两张桌子。如何从我的案例的第一张表中找到第二张表中的缺失行?

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

请给解决了我的方案

+1

? – dotnetom

+2

您的查询已准备就绪。用'..解决它在哪里(a.iso,a。WeldNo)not in ..'(这是用于MySQL的,不知道它是否适用于sql-server)。 –

+1

我第二个dotnetom的问题。你对一般的SQL,MySQL或SQL Server有什么要求?除非你正在谈论在他们之间移植一个数据库,否则你不应该同时标记mysql和sql-server。因此,如果它是通用SQL,则同时删除MySQL和sql-server。如果它关于特定数据库选择那个。 – Codeguy007

回答

2

从对问题的标签并不清楚您正在使用的RDBMS。如果您使用的是SQL Server,您可以使用EXCEPT

select a.iso, a.WeldNo 
from first a 

EXCEPT 

select b.iso, b.WeldNo 
from second b 

这从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) 
+0

您的列顺序在第二个查询中是differend。 'a.WeldNo,a.iso'和'b.iso,b.WeldNo'。 –

+0

@PaulSpiegel感谢您的注意,修复它 – dotnetom

+0

没有任何工作任何查询在这里。 – user3041016

0

您可以使用一个LEFT JOINEXCEPT

左连接:

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 

有一定的差异,但。在除外情况下,两个结果必须具有相同的列,而LEFT JOIN可让您指定要从每个表中选择的内容。此外,在大多数情况下,LEFT JOIN将更具性能,因为它更好地优化。但是,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 

所有这一切说,它可能会更好使用LEFT JOIN,但它可能会因你的数据库的不同而不同。

0

我会用not exists因为它表达的意图明确,即“从表1中选择所有行具有相同的ISO和表2的行WeldNo不存在”那么,你使用MySQL或SQL Server

select * from table1 t1 
where not exists (
    select 1 from table2 t2 
    where t2.iso = t1.iso 
    and t2.WeldNo = t1.WeldNo 
)