我有这个表
FieldA | FieldB
---------------
1 12
1 13
1 14
2 12
2 13
3 12
3 13
我想得到FieldA,其中FieldB等于12,但也等于13,但不等于14。
Expected output:
FieldA
-------
2
3
到目前为止,我已经得出以下结论:
SELECT FieldA FROM table
WHERE FieldB IN (12, 13) AND FieldB NOT IN (14)
但它似乎不起作用,我错过了什么?此外,我想以一种跨数据库的方式来做这件事。
这是"集中的集合"子查询的一个例子。我喜欢用group by
和having
来处理这些问题,因为这是一种非常灵活的方法。基于文本中的问题:
SELECT FieldA
FROM table
GROUP BY FieldA
HAVING SUM(CASE WHEN FieldB = 12 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN FieldB = 14 THEN 1 ELSE 0 END) = 0;
having
子句中的每个条件都在检查您关心的条件之一。第一个计数FieldB = 12
和> 0
确保至少有一个的行数。第二个计数FieldB = 14
。= 0
确保没有。
如果按照代码的建议,您想要12和13,那么您可以执行:
SELECT FieldA
FROM table
GROUP BY FieldA
HAVING SUM(CASE WHEN FieldB = 12 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN FieldB = 13 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN FieldB = 14 THEN 1 ELSE 0 END) = 0;
而且,如果你想要12或13,你可以这样做:
SELECT FieldA
FROM table
GROUP BY FieldA
HAVING SUM(CASE WHEN FieldB IN (12, 13) THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN FieldB = 14 THEN 1 ELSE 0 END) = 0;