Дубликаты в таблице с множественными условиями
Вводные данные
Таблица со зданиями и координатами (в оригинальной таблице более 100 тыс. строк):
CREATE TABLE table1(
building_id int,
region varchar(55),
street varchar(55),
housenumber varchar(55),
pos_x float,
pos_y float,
version int
);
INSERT ALL
INTO table1(building_id,region, street, housenumber, pos_x, pos_y, version) VALUES(1, 'Moscow','Lenina', '1a', 45.45, 55.55, NULL )
INTO table1(building_id,region, street, housenumber, pos_x, pos_y, version) VALUES(2, 'Spb','Mira', '20', 45.10, 55.10, NULL )
INTO table1(building_id,region, street, housenumber, pos_x, pos_y, version) VALUES(3, 'Moscow','Lenina', '1a', 45.85, 55.85, NULL )
INTO table1(building_id,region, street, housenumber, pos_x, pos_y, version) VALUES(4, 'Moscow', 'Lenina', '1a', 45.85, 55.85, 20 )
SELECT * FROM dual;
Ссылка на Fiddle http://sqlfiddle.com/#!4/947275/2
Вывод
Building_ID | region | street | housenumber | pos_x | pos_y | version |
---|---|---|---|---|---|---|
1 | Moscow | Lenina | 1a | 45.45 | 55.55 | NULL |
2 | Spb | Mira | 20 | 45.1 | 55.1 | NULL |
3 | Moscow | Lenina | 1a | 45.85 | 55.85 | NULL |
4 | Moscow | Lenina | 1a | 45.85 | 55.85 | 20 |
Ожидаемый результат
Building_ID | region | street | housenumber | pos_x | pos_y | Version |
---|---|---|---|---|---|---|
1 | Moscow | Lenina | 1a | 45.45 | 55.55 | NULL |
3 | Moscow | Lenina | 1a | 45.85 | 55.85 | NULL |
Необходимо, чтобы в запрос попали одинаковые по ID, region, street, housenumber, но разные по pos_x и pos_y строки. В добавок еще, чтобы и версия была обязательно NULL (поэтому 4 строчка не попадает)
Пробую запрос:
SELECT *
FROM MAP_IMPORT A
WHERE EXISTS (
SELECT COUNT(*)
FROM MAP_IMPORT t
WHERE a.region = t.region
AND a.street = t.street
AND a.housenumber = t.housenumber
AND a.pos_x <> t.pos_x
AND a.pos_y <> t.pos_y
and a.version_delete is null
and t.version_delete is null
HAVING COUNT(*) > 1
)
sqldeveloper зависает на выполнении. Оставлял на ночь. До сих пор не может справится. Причем если прошу завершить работу, он даже не ругается (как обычно) на то, чо выполняется запрос. Т.е. просто идёт running, но по факту запрос не выполняется...
Источник: Stack Overflow на русском