假设我有一个这样的表:
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的问题,我发现的所有问题都涉及基于两个行值的选择问题。我已经在查询的后半部分解决了该问题。
答案 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);