我有一个 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 方法可能更易于管理。