SQL多个在同一个字段上的位置

时间:2014-04-27 17:45:33

标签: sql

我有这张桌子

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)

但它似乎不起作用,我错过了什么?另外,我想以跨数据库的方式进行。

1 个答案:

答案 0 :(得分:3)

这是" set-within-sets"子查询。我喜欢用group byhaving处理这些问题,因为这是一种非常灵活的方法。根据案文中的问题:

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;