2012-12-10 58 views
0

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

时做这样的任务(而不是上市,除了主键列的所有列),这样我可以找出重复的行是否有办法忽略主键?

回答

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; 
+0

感谢这看起来可以完成这项工作。我会试一下 – Cemre

0

您将不得不显式列出其他列。

潜在地,您可以使用动态SQL来生成所需的查询。但是,如果这仅仅是一张桌子,这不太可能有帮助。如果您试图自动化比较数十个或数百个表的过程,那么动态SQL方法可能更容易管理。