我有两张桌子。
表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);
请为我的方案提供解决方案
答案 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
答案 2 :(得分:0)
您可以使用LEFT JOIN
或EXCEPT
。
左连接:
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
)