标题并没有解释这个问题,所以我举一个例子:
表1(OrderNum,OrderLine) - 所有已创建的OrderLines。 表2(OrderNum,OrderLin) - 现在要打印的订单行。
表2总是在表1中具有匹配,因为它从表1中填充,但有时缺少表1中订单的行。例如:
表1:
OrderNum, OrderLine
100, 1
100, 2
100, 3
100, 4
101, 1
102, 1
102, 2
表2:
OrderNum, OrderLine
100, 1
100, 2
100, 4
101, 1
在这种情况下,我需要打印订单100的所有4行,第3行标记为缺失,所有订单101,但没有订单102.显然我的表比这大得多,但这总结了我的困境。我无法控制如何填充任何一个表。
如果我在OrderNum和OrderLine上将表2加入表1,那么我也得到OrderNum 102,我不想要那样。如果我加入OrderNum,那么我会得到表2中每一行的100号订单,我如何找到未被欺骗的1条记录?
希望这对我的问题有意义。我试过谷歌搜索,但条款是如此通用我得到许多不相关的结果。
答案 0 :(得分:0)
使用left join
和exists()
:
select
t1.OrderNum
, t1.OrderLine
, Missing = case when t2.OrderLine is null then 'Flag' else '' end
from t1
left join t2
on t1.OrderNum = t2.OrderNum
and t1.OrderLine = t2.OrderLine
where exists (
select 1
from t2 i
where t1.OrderNum = i.OrderNum
)
rextester演示:http://rextester.com/SZPX33524
返回:
+----------+-----------+---------+
| OrderNum | OrderLine | Missing |
+----------+-----------+---------+
| 100 | 1 | |
| 100 | 2 | |
| 100 | 3 | Flag |
| 100 | 4 | |
| 101 | 1 | |
+----------+-----------+---------+