Oracle - HAVING COUNT> 1没有给出多列结果

时间:2016-12-27 08:30:21

标签: sql oracle

我有一个查询在表上找到重复的值:

SELECT
  crl_id,
  COUNT(crl_id)
FROM
  crl_table
WHERE
  crl_id !=0
GROUP BY
 crl_id
  HAVING COUNT (crl_id) >1

这给了我结果(如果存在重复值):

crl_id: 15755  count:2 

当我在查询中添加其他列时(例如此表中主键的ID):

SELECT
  pk_crl_id,
  crl_id,
  COUNT(crl_id)
FROM
  crl_table
WHERE
  crl_id !=0
GROUP BY
pk_crl_id, crl_id
  HAVING COUNT (crl_id) >1

没有给出结果,好像没有重复的值退出(它们确实存在!)。请帮忙。

3 个答案:

答案 0 :(得分:3)

如果您将PK添加到组中,则每个组不能超过一行,因为PK列是唯一的。

如果您想要其他列但按子集分组,则可以使用窗口函数:

Using shoulda-matchers 3.0.1 from git://github.com/thoughtbot/shoulda-matchers.git (at master@db67d27)  
Using capybara 2.6.0.dev from git://github.com/jnicklas/capybara.git (at master@e6886de) 

答案 1 :(得分:0)

主键是唯一的。因此,如果您在组中添加主键,那么您将永远不会获得重复值。试试这个查询。

SELECT pk_crl_id 
 FROM crl_table
WHERE crl_id IN (SELECT crl_id
             FROM crl_table
            WHERE crl_id !=0
             GROUP BY crl_id
             HAVING COUNT (crl_id) >1);

答案 2 :(得分:0)

另一种方法 - 每个"重复生产一行" crl_id,以逗号分隔列表中显示的相应PK值,如下所示:

select   crl_id, count(crl_id) as ct, 
         listagg(pk_crl_id, ',') within group (order by pk_crl_id) as pk_list
from     crl_table
where    crl_id != 0
group by crl_id
having   count(crl_id) > 1
;