我有一個Oracle表,我想知道是否有任何重複行(即所有列值相等)。問題是行有獨特的主鍵,所以我想排除他們,因爲他們基本上阻止我這樣做。從表中選擇重複的行(忽略主鍵)
時做這樣的任務(而不是上市,除了主鍵列的所有列),這樣我可以找出重複的行是否有辦法忽略主鍵?
我有一個Oracle表,我想知道是否有任何重複行(即所有列值相等)。問題是行有獨特的主鍵,所以我想排除他們,因爲他們基本上阻止我這樣做。從表中選擇重複的行(忽略主鍵)
時做這樣的任務(而不是上市,除了主鍵列的所有列),這樣我可以找出重複的行是否有辦法忽略主鍵?
沒有,只是列出所有列,除了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;
您將不得不顯式列出其他列。
潛在地,您可以使用動態SQL來生成所需的查詢。但是,如果這僅僅是一張桌子,這不太可能有幫助。如果您試圖自動化比較數十個或數百個表的過程,那麼動態SQL方法可能更容易管理。
感謝這看起來可以完成這項工作。我會試一下 – Cemre