使用查找表搜索数据中的特定值

时间:2019-05-08 12:10:45

标签: sql

我有一个查找表,其中包含要在数据中检查的值。

问题有点像这样:

-- 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。我已经尝试了不同的联接和集合运算符,但似乎无法解决这个问题。

一些帮助将不胜感激。

2 个答案:

答案 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