У меня есть такая таблица (базовый пример, а не реальная вещь):
FKEY | NAME | ATTRIBUTE_X
--------------------------
1 '...' 42
1 '...' 42
1 '...' 42
2 '...' 7
2 '...' 7
5 '...' 42
5 '...' 42
5 '...' 42
5 '...' 42
6 '...' 300
6 '...' 300
....
Где - обычно - все значения attribute_x для данной клавиши одинаковы.(В моих реальных данных я вычисляю attribute_x из некоторых столбцов таблицы, и это свойство должно быть одинаковым для всех строк с одним и тем же fkey.
Теперь у меня есть несколько строк, в которых это свойство не хранится. Iхочу выполнить поиск по всей таблице, чтобы найти все FKEY с несоответствующими значениями attribute_x.
Пример:
--------------------------
145678973 '...' 23
145678973 '...' 22 // Error, should also be 23
145678973 '...' 23
Мой наивный подход был:
SELECT distinct(TX1.FKEY)
FROM TABLEX TX1, TABLEX TX2
WHERE TX1.FKEY=TX2.FKEY
AND TX1.ATTRIBUTE_X <> TX2.ATTRIBUTE_X
;
Но с моим реальнымданные, которые он не завершил (я запустил временное табличное пространство, и после того, как администратор баз данных увеличил временное табличное пространство до 20 гигабайт, запрос выполнялся в течение нескольких часов, а затем выручал).
В общем, есть ли более эффективныйзапрос для этого?
У меня есть решение с PL / SQL, где я просто циклически перебираю таблицу, отсортированную по FKEY, и если я нахожу другой attribute_x по сравнению с последней извлеченной записью, где клавиша остановилась,то же самое, я нашел ошибочную клавишу fkey.
Но это кажется таким уж примитивным :-) Есть ли эффективное решение для чистого SQL?