错误:列必须出现在GROUP BY子句中或用于聚合函数

时间:2014-10-30 16:08:36

标签: sql postgresql aggregate-functions

示例数据:

test,test2
----------
a,qwer
b,wert
c,erty
d,rtuy
d,tyui
e,yuio
e,uiop

我正在尝试编写一个在表中返回唯一值的查询:

SELECT
  test

FROM aatest
GROUP BY test
HAVING (COUNT(test) = 1)

这有效并返回a,b和c,因为d和e不是唯一的。

但是我想打印出test2,所以我尝试了:

select 
test, 
test2
from aatest
GROUP BY test
HAVING (COUNT(test) = 1)

但是我得到了错误。

6 个答案:

答案 0 :(得分:1)

错误消息清楚地解释了问题。 select语句中的列列表必须存在于组中,除非你有一个聚合函数(max,min,sum,count等)。试试这个,这就是你想要实现的目标

SELECT a.test,
       a.test2
FROM   aatest a
       JOIN (SELECT test
             FROM   aatest
             GROUP  BY test
             HAVING ( Count(test) = 1 )) b
         ON a.test = b.test 

答案 1 :(得分:1)

将其他列包含在min()max()等聚合函数中。由于每个聚合只有一行,因此无关紧要:

SELECT test, min(test2) AS test2
FROM   aatest
GROUP  BY test
HAVING count(*) = 1;

对于许多列,这更简单:

SELECT t1.*  -- return all columns
FROM   aatest t1
LEFT   JOIN aatest t2 ON t2.test = t1.test AND t2.ctid <> t1.ctid
WHERE  t2.test IS NULL;

假设没有PK或任何其他唯一的列组合我们可以用来明确地识别行,我使用internal (Postgres specific!) tuple ID ctid。相关:

如果(test, test2) 唯一

SELECT t1.*  -- return all columns
FROM   aatest t1
LEFT   JOIN aatest t2 ON t2.test = t1.test AND t2.test2 <> t1.test2
WHERE  t2.test IS NULL;

答案 2 :(得分:0)

将其包装在子查询中

SELECT * FROM aatest
JOIN (
SELECT
  test
FROM aatest
GROUP BY test
HAVING (COUNT(test) = 1)
) T
on aatest.test = T.test

答案 3 :(得分:0)

正在发生的事情是您在Test列中对所有重复值进行分组,但如果Test2中的值是唯一的,那么它们将去哪里?如果测试2中的值是数字,您可以在语句中使用聚合函数(例如count():

)选择它们
select 
test, 
count(test2)
from aatest
GROUP BY test
HAVING (COUNT(test) = 1)

答案 4 :(得分:0)

您需要在group by子句中包含列 test2 。 否则对那个特定的列使用聚合函数

答案 5 :(得分:-2)

使用:

SELECT
  DISTINCT(test)
FROM aatest

http://www.postgresql.org/docs/9.0/static/sql-select.html