从表中选择重复行(忽略主键)

时间:2012-12-10 14:41:07

标签: oracle select duplicates

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

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

2 个答案:

答案 0 :(得分:2)

不,只列出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;

答案 1 :(得分:0)

您必须明确列出其他列。

您可以使用动态SQL生成所需的查询。但如果仅仅针对单个表格,那么这不太可能非常有用。如果您尝试自动执行比较数十个或数百个表的过程,则可能更容易管理动态SQL方法。