示例数据:
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)
但是我得到了错误。
答案 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)