我有一个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