如何在我的案例中从第一个表中查找第二个表中的缺失行?

时间:2016-04-24 17:35:59

标签: 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          | 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);

请为我的方案提供解决方案

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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

另见this great explanation of joins

答案 2 :(得分: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

但是存在一些差异。在except的情况下,两个结果必须具有相同的列,而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可能更好,但可能会因您的数据库而异。

答案 3 :(得分:0)

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

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