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

egg*_*ert 2 sql postgresql aggregate-functions

示例数据:

test,test2
----------
a,qwer
b,wert
c,erty
d,rtuy
d,tyui
e,yuio
e,uiop
Run Code Online (Sandbox Code Playgroud)

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

SELECT
  test

FROM aatest
GROUP BY test
HAVING (COUNT(test) = 1)
Run Code Online (Sandbox Code Playgroud)

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

但我也想打印出 test2 所以我试过:

select 
test, 
test2
from aatest
GROUP BY test
HAVING (COUNT(test) = 1)
Run Code Online (Sandbox Code Playgroud)

但我得到了错误。

Erw*_*ter 5

将其他列包装在聚合函数中,例如min()max()。由于每个聚合只有一行,因此哪个并不重要:

SELECT test, min(test2) AS test2
FROM   aatest
GROUP  BY test
HAVING count(*) = 1;
Run Code Online (Sandbox Code Playgroud)

对于很多列,这更简单:

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;
Run Code Online (Sandbox Code Playgroud)

假设没有 PK 或任何其他可以用来明确标识行的唯一列组合,我使用内部(特定ctidPostgres!)元组 ID。有关的:

如果(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;
Run Code Online (Sandbox Code Playgroud)