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

kro*_*ock 0 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
Run Code Online (Sandbox Code Playgroud)

我想选择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'
Run Code Online (Sandbox Code Playgroud)

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

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

Lar*_*rnu 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);
Run Code Online (Sandbox Code Playgroud)