我正在使用此查询在表中查找重复值:
select col1,
count(col1)
from table1
group by col1
having count (col1) > 1
order by 2 desc;
但我还要在同一个表中添加另一列,如下所示:
select col1,
col2,
count(col1)
from table1
group by col1
having count (col1) > 1
order by 2 desc;
我在第二个查询中遇到ORA-00979
错误
如何在搜索中添加其他列?
答案 0 :(得分:7)
您的查询应该是
SELECT * FROM (
select col1,
col2,
count(col1) over (partition by col1) col1_cnt
from table1
)
WHERE col1_cnt > 1
order by 2 desc;
答案 1 :(得分:3)
据推测,您希望获得col2
的每个副本col1
。你不能在一个查询中真正做到这一点^。相反,您需要做的是获取重复列表,然后使用它来检索任何其他相关值:
select col1, col2
from table1
where col1 in (select col1
from table1
group by col1
having count (col1) > 1)
order by col2 desc
^好的,您可以使用分析函数作为@rs。证明。对于这种情况,我怀疑嵌套查询会更有效,但两者都应该给你相同的结果。
根据评论,您似乎不清楚为什么不能只添加第二列。假设您有样本数据,如下所示:
Col1 | Col2
-----+-----
1 | A
1 | B
2 | C
2 | D
3 | E
如果你跑
select Col1, count(*) as cnt
from table1
group by Col1
having count(*) > 1
然后您的结果将是:
Col1 | Cnt
-----+-----
1 | 2
2 | 2
您不能只将Col2
添加到此查询中而不将其添加到group by
子句中,因为数据库无法知道您实际需要哪个值(即Col1 = 1应该是DB返回'A'或'B'?)。如果将Col2添加到group by
子句中,则会得到以下内容:
select Col1, Col2, count(*) as cnt
from table1
group by Col1, Col2
having count(*) > 1
Col1 | Col2 | Cnt
-----+------+----
[no results]
这是因为计数适用于Col1
和Col2
的每个组合(每个组合都是唯一的)。
最后,通过使用嵌套查询(如我的答案)或分析函数(如@ rs。的答案),您将得到以下结果(查询略有改变以返回计数):< / p>
select t1.col1, t1.col2, cnt
from table1 t1
join (select col1, count(*) as cnt
from table1
group by col1
having count (col1) > 1) t2
on table1.col1 = t2.col1
Col1 | Col2 | Cnt
-----+------+----
1 | A | 2
1 | B | 2
2 | C | 2
2 | D | 2
答案 2 :(得分:0)
您还应列出group by子句中的所有选定列。
select col1,
col2,
count(col1)
from table1
group by col1, col2
having count (col1) > 1
order by 2 desc;
答案 3 :(得分:0)
错误原因
您尝试执行包含GROUP BY的SQL SELECT语句 函数(即:SQL MIN函数,SQL MAX函数,SQL SUM函数, SQL COUNT函数)和SELECT列表中没有的表达式 在SQL GROUP BY子句中。
select col1,
col2,
count(col1)
from table1
group by col1,col2
having count (col1) > 1
order by 2 desc;