GROUP BY HAVING NOT会产生错误的结果

时间:2014-08-05 09:15:38

标签: sql sqlite

我在SQLite数据库上运行GROUP BY和HAVING NOT查询,但发现这并不排除包含NOT的组,只包括行。示例如下:

-- Create sample db
CREATE TABLE sample(Year INT, Var INT);
-- Generate data
INSERT INTO sample (Year, Var)
VALUES (2005, 1);
INSERT INTO sample (Year, Var)
VALUES (2005, 3);
INSERT INTO sample (Year, Var)
VALUES (2006, 2);
INSERT INTO sample (Year, Var)
VALUES (2006, 3);
INSERT INTO sample (Year, Var)
VALUES (2007, 1);
INSERT INTO sample (Year, Var)
VALUES (2007, 2);

如果我运行以下查询,则只返回组2005和2007,因为它们是唯一包含1的组:

SELECT * FROM sample
GROUP BY Year, Var
HAVING Var = 1

如果我更改此查询以排除包含1的组,则返回所有组(即使包含1的组),但不返回包含1的行。

SELECT * FROM sample
GROUP BY Year, Var
HAVING Var != 1

本质上,HAVING子句现在似乎表现为WHERE子句。应该发生的是上述两个查询应该生成反向结果,即第一个选择仅选择2005年和2007年,第二个选择仅选择2006年。

我的问题是我如何只选择Var列中不包含给定值的组,后面是我应该提交的错误?

所以我希望/期望第二个查询只返回group / Year 2006,因为它是唯一一个不包含Var的1。

2 个答案:

答案 0 :(得分:1)

下面的查询会给你结果:

SELECT * FROM sample
WHERE VAR !=1
GROUP BY Year, Var

但是,您也可以使用,

SELECT * FROM SAMPLE WHERE VAR !=1

因为group by对您指定的表和查询没有意义。

FIDDLE here用于两个查询。


修改

这会对你有所帮助。请参阅更新后的FIDDLE

中的第三个查询
SELECT * FROM SAMPLE
WHERE YEAR NOT IN
(
    SELECT YEAR FROM SAMPLE WHERE VAR=1
)

答案 1 :(得分:0)

SELECT Year, count(var) FROM sample
WHERE Var != 1
GROUP BY Year

这应该是您的预期结果。看一下diff查询并理解group by的概念。您不需要像@CL所说的那样对Var列进行分组。

添加Fiddle示例