Еще один подход, который будет работать в 9i.Я не даю никаких гарантий производительности, только то, что это чисто SQL-подход, который работает на 9i, но запуск для 10000 строк с 5 столбцами занимает менее секунды, поэтому это разумно.
create table test (
uniqueKey number,
c1 number,
c2 number,
c3 number,
c4 number,
c5 number)
Построить несколько тестовых примеров- каждая 4-я строка плохая - мы используем псевдостолу целых чисел
insert into test
select r,1,2,3,4,CASE WHEN MOD(r,4)=0 THEN 4 ELSE 5 END
FROM (SELECT rownum r from dual connect by rownum <= 10000);
Теперь преобразуем значения столбца обратно в строки, используя ту же технику псевдотаблицы над последовательностью целых чисел
SELECT uniqueKey,r from
(
SELECT rownum r from dual connect by rownum <= 100
/* 100 is the max value in any of our columns */
) numbers,
test
WHERE r in (c1,c2,c3,c4,c5)
Это дает набор уникальных номеров для каждой строки.
Чтобы найти недопустимые строки, просто проверьте, меньше ли число столбцов
SELECT uniqueKey from
(
SELECT rownum r from dual connect by rownum <= 100 /* Our max potential value */
) numbers,
test
WHERE r in (c1,c2,c3,c4,c5)
GROUP BY uniqueKey
HAVING COUNT(r) < 5
К сожалению, это не говорит вам, какие значения дублируются, но идентифицирует ваши проблемные строки.