标记2个数据集之间的缺失记录

时间:2017-05-02 21:04:00

标签: sql-server

标题并没有解释这个问题,所以我举一个例子:

表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条记录?

希望这对我的问题有意义。我试过谷歌搜索,但条款是如此通用我得到许多不相关的结果。

1 个答案:

答案 0 :(得分:0)

使用left joinexists()

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 |         |
+----------+-----------+---------+