2012-12-10 70 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方法可能更容易管理。