SQL Server-是否有更好的方法让我根据不同数量的行中的值进行选择?

时间:2019-03-07 16:49:02

标签: sql sql-server

假设我有一个这样的表:

id     value
1      a
1      x
1      x
2      b
2      b
2      y
3      c
3      d
3      z
10     c
10     c
10     z
11     x
11     y
11     z

我想选择ID(可以重复ID),其中值是a,b或c和d。因此,在这种情况下,我将选择1、2和3。请注意,每个id值组合都可以使用重复值。

我有这个有效的代码:

SELECT id 
FROM table
WHERE value = 'a' OR value = 'b'

UNION 

SELECT t1.id 
FROM table t1 
INNER JOIN table t2
ON t1.id = t2.id 
WHERE t1.value = 'c' AND t2.value = 'd'

但是我的SQL技能很生疏,我无法动摇有更好的方法来做这件事。这将是一些复杂的遗留代码中间的子查询,因此我想确保我的代码简洁高效。

这个问题也不是重复的,因为它涉及基于一个行值或两个行值同时选择id的问题,我发现的所有问题都涉及基于两个行值的选择问题。我已经在查询的后半部分解决了该问题。

1 个答案:

答案 0 :(得分:5)

HAVING带有一些条件聚合的条款将在这里发挥作用:

SELECT id
FROM (VALUES(1 ,'a'),
            (1 ,'x'),
            (1 ,'x'),
            (2 ,'b'),
            (2 ,'b'),
            (2 ,'y'),
            (3 ,'c'),
            (3 ,'d'),
            (3 ,'z'),
            (10,'c'),
            (10,'c'),
            (10,'z'),
            (11,'x'),
            (11,'y'),
            (11,'z')) V(id, [value])
GROUP BY id
HAVING COUNT(CASE [value] WHEN 'a' THEN 1 WHEN 'b' THEN 1 END) > 0
    OR (COUNT(CASE [value] WHEN 'c' THEN 1 END) > 0
   AND  COUNT(CASE [value] WHEN 'd' THEN 1 END) > 0);