2014-10-30 52 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;