2014-10-30 55 views
0

实施例的数据:ERROR:列必须出现在GROUP BY子句或在聚合函数可以使用

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不是唯一的。

但我想打印出测试2和,所以我尝试:

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

但我得到的错误。

+0

难道我们假设表没有主键或唯一列的任何其他组合? – 2014-10-30 16:52:04

回答

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 
+0

使用'USING(test)'或者你必须在SELECT列表中定义不明确的列名:'a.test'。 – 2014-10-30 17:03:43

+0

@ErwinBrandstetter - 没有正确检查。现在更正,谢谢指出 – 2014-10-30 17:05:49

0

包装在一个子查询

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

什么发生的事情就是你在Test列中将所有重复的值分组,但是如果Test2中的值是唯一的,他们将要去哪里?如果在测试两个值分别为数字,你可以在语句的聚合函数选择它们如count():

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

裹在像min()max()聚合函数的另一列(S)。由于只有每个聚集单行,它并不重要:

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;