在oracle中查找重复值

时间:2013-01-25 18:15:16

标签: sql oracle

我正在使用此查询在表中查找重复值:

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错误

如何在搜索中添加其他列?

4 个答案:

答案 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]

这是因为计数适用于Col1Col2的每个组合(每个组合都是唯一的)。

最后,通过使用嵌套查询(如我的答案)或分析函数(如@ 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;