3

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

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

4 回答 4

7

您的查询应该是

SELECT * FROM (
select col1, 
col2, 
count(col1) over (partition by col1) col1_cnt
from table1 
)
WHERE col1_cnt > 1 
order by 2 desc;
于 2013-01-25T18:23:02.347 回答
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,数据库应该返回“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]

这是因为计数是针对Col1and的每个组合Col2(每个组合都是唯一的)。

最后,通过使用嵌套查询(如我的回答)或分析函数(如@rs.的回答),您将得到以下结果(查询稍作更改以返回计数):

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
于 2013-01-25T18:24:41.040 回答
0

您还应该在 group by 子句中列出所有选定的列。

select col1, 
       col2, 
       count(col1) 
  from table1 
 group by col1, col2
having count (col1) > 1 
 order by 2 desc;
于 2013-01-25T18:20:34.523 回答
0

错误原因

您尝试执行一个 SQL SELECT 语句,该语句包括一个 GROUP BY 函数(即:SQL MIN 函数、SQL MAX 函数、SQL SUM 函数、SQL COUNT 函数)和一个不在 SQL GROUP BY 子句中的 SELECT 列表中的表达式。

select col1, 
    col2, 
    count(col1) 
    from table1 
    group by col1,col2
    having count (col1) > 1 
    order by 2 desc;
于 2013-01-25T18:20:36.390 回答