找到完全不同的行

时间:2015-08-24 04:41:04

标签: oracle distinct

我有一个使用Informatica工作流编译的Oracle表。它未通过完整性检查,因为以下查询返回不同数量的行:

SELECT DISTINCT * FROM table // 4,000 rows
SELECT * FROM table // 4,006 rows

该表由17个字段组成,其中没有一个是唯一键(显然)。如何找到6个重复的行?

2 个答案:

答案 0 :(得分:3)

用于返回重复的行。

  select * from 
    (SELECT cd.*,
            ROW_NUMBER ()
            OVER (PARTITION BY column1,column2...column2
                  ORDER BY column_names)
               seq_no
       FROM table cd)
    where seq_no>1;

例如,我在下面创建了一个sample_table,以便您更好地理解。

create table sample_table
(
id1 number,
id2 number
)

我已将下面的数据插入表格

 ID1    ID2
    1   2
    1   2
    1   2
    2   3
    2   3
    2   3

在上面的数据集中,我们有6行但只有两行是不同的。 通过使用以下查询,我们可以获得不同的行和不同的行。

    SELECT cd.*,
                ROW_NUMBER ()
                OVER (PARTITION BY id1
                      ORDER BY id1)
                   seq_no
           FROM sample_table cd

在id1的帮助下对表格进行分区后,我们将得到以下结果

ID1 ID2 SEQ_NO
1   2   1
1   2   2
1   2   3
2   3   1
2   3   2
2   3   3

然后,如果您想查看不同的行,请使用以下查询

select * from 
    (SELECT cd.*,
            ROW_NUMBER ()
            OVER (PARTITION BY id1
                  ORDER BY id1)
               seq_no
       FROM sample_table cd)
    where seq_no=1;

如果您想在查询

下面看到重复的集合使用
select * from 
    (SELECT cd.*,
            ROW_NUMBER ()
            OVER (PARTITION BY id1
                  ORDER BY id1)
               seq_no
       FROM sample_table cd)
    where seq_no>1;

答案 1 :(得分:0)

一个可能性是使用分析函数来计算同一组中的行,我不知道如何在不编写某些子句中的所有列的情况下编写查询:

select * 
from (
   Select a.*, count(*) over (partition by column1, column2, ..., column17) as cnt
   from your_table a
)
where cnt>1

这应该有12行,因为6行是重复的。

基本的SQL查询是:

select  col1, col2, ..., col17
from table
group by col1, col2, ..., col17
having count(*) > 1;