Дубликаты в таблице с множественными условиями

Рейтинг: 0Ответов: 1Опубликовано: 05.02.2023

Вводные данные

Таблица со зданиями и координатами (в оригинальной таблице более 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, но по факту запрос не выполняется...

Скрин_1

Скрин

Ответы

▲ 1Принят

На входящих данных получилось добиться нужного вам результата следующим запросом

SELECT * FROM table3 z
WHERE EXISTS (
  SELECT 1
  FROM table3 x
  WHERE x.region = z.region
  AND x.street = z.street
  AND x.housenumber = z.housenumber
  AND x.pos_x <> z.pos_x
  AND x.pos_y <> z.pos_y
  AND x.building_id <> z.building_id
  AND x.version IS NULL
) 
AND z.version IS NULL;