【问题标题】:Selecting duplicate rows from a table (ignoring the primary key)从表中选择重复行(忽略主键)
【发布时间】:2012-11-27 23:53:06
【问题描述】:

我有一个 Oracle 表,我想在其中找出是否有任何重复的行(即所有列值都相等)。问题是这些行具有唯一的主键,所以我想排除它们,因为它们基本上阻止了我这样做。

有没有办法在执行此类任务时忽略主键(而不是列出除主键列之外的所有列),以便找出重复的行?

【问题讨论】:

    标签: oracle select duplicates


    【解决方案1】:

    不,只列出GROUP BY子句中除主键列之外的所有列:

    CREATE TABLE mytable (
      pk NUMBER PRIMARY KEY,
      c1 NUMBER NOT NULL,
      c2 NUMBER
    );
    
    INSERT INTO mytable (pk, c1, c2) VALUES (100, 1, 1);
    INSERT INTO mytable (pk, c1, c2) VALUES (101, 1, 1);
    INSERT INTO mytable (pk, c1, c2) VALUES (102, 2, 1);
    INSERT INTO mytable (pk, c1, c2) VALUES (103, 2, null);
    INSERT INTO mytable (pk, c1, c2) VALUES (104, 2, null);
    
    SELECT c1, c2
      FROM mytable
     GROUP BY c1, c2
    HAVING COUNT(*) > 1;
    
    C1    C2
    ----- -----
    1     1
    2     (null)
    

    要找出非主键列,您可以使用以下查询。对于大多数表,键入列而不是粘贴/运行查询会更快:

    SELECT column_name
      FROM user_tab_columns co
     WHERE co.table_name = 'MYTABLE'
       AND NOT EXISTS (
           SELECT *
             FROM user_constraints  pk
             JOIN user_cons_columns pc USING (owner, constraint_name)
            WHERE pk.table_name = co.table_name
              AND constraint_type='P'
              AND co.column_name = pc.column_name)
     ORDER BY co.column_id;
    

    【讨论】:

    • 谢谢,这看起来可以完成这项工作。我试试看
    【解决方案2】:

    您将不得不明确列出其他列。

    您可能会使用动态 SQL 来生成您想要的查询。但是,如果这只是针对单个表,那么这不太可能非常有用。如果您试图自动化比较数十或数百个表的过程,动态 SQL 方法可能更易于管理。

    【讨论】:

      猜你喜欢
      • 2017-06-19
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多