我有一个查找表,其中包含要在数据中检查的值。
问题有点像这样:
-- Data with an ID, a group (which is a number) and some letters which belong to that group.
select *
into #data
from (values
(1, 45, 'A'),
(1, 45, 'B'),
(1, 45, 'C'),
(2, 45, 'D'))
as data(id, number, letter)
-- The various letters that I expect for each ID in a specific group
select *
into #expected_letters
from (values
(45, 'A'),
(45, 'D'),
(45, 'E'),
(123, 'A'),
(123, 'Q'))
as expected_letters(number, letter)
我期望查询得到的结果是我希望属于该组的所有字母(来自id
的所有#data
)。因此,这些结果实际上是:
(1, 45, D)
(1, 45, E)
(2, 45, A)
(2, 45, E)
在我的问题中,列表更长,带有更多的组和更多的ID。我已经尝试了不同的联接和集合运算符,但似乎无法解决这个问题。
一些帮助将不胜感激。
答案 0 :(得分:1)
这是我尝试过的方法,它似乎有效。最后一个别名为“ nums”的内部联接是要从结果中删除数字123,因为#data中的任何ID都不存在。
select e.*, ids.id from #expected_letters e
cross join (select distinct id from #data) ids
full join #data d on e.number = d.number and e.letter = d.letter and d.id = ids.id
inner join (select distinct number from #data) nums on e.number = nums.number
where
d.id is null
-结果:
number letter id
45 A 2
45 D 1
45 E 1
45 E 2
答案 1 :(得分:1)
这是我的版本,非常相似,但是使用外部应用而不是多个联接。 :-
select distinct d.id, aa.number,aa.letter from #data d
outer apply (select * from #expected_letters el where el.number=d.number and el.letter not in
(select letter from #data dt where dt.number=d.number and dt.id=d.id)
) aa