Я ищу строки, которые совпадают, и у меня возникла проблема, когда поле даты рождения null
.
В настоящее время у меня есть два сценария, которые могут идентифицировать три вида одинаковости, которые я ищу, но я бы хотел сделать это с одним.
Да, данные могут быть обновлены для использования известной даты, которая может означать ноль, но я не хочу менять данные или копировать в новую таблицу.
Мне удалось создать один скрипт, который выполняет всю работу, но на его запуск уходит ужасное количество времени. Я смог сделать это только благодаря этому ответу . Оба сценария выполняются менее чем за секунду, в то время как один сценарий занимает 26 минут.
Сценарий 1, который соответствует нулевым датам рождения, но пропускает имена одинаковые
SELECT last_name, birthdate, count(distinct first_name)
FROM merged_person
having count(distinct first_name) >1
GROUP BY last_name, birthdate
ORDER BY last_name;
Сценарий 2, который пропускает нулевые даты рождения
SELECT *
FROM merged_person
WHERE (last_name, birthdate) IN
(SELECT last_name, birthdate
FROM merged_person
GROUP BY last_name, birthdate
HAVING COUNT(*) > 1
)
ORDER BY last_name, birthdate;
Сценарий 3 варианта, который находит все результаты, но занимает слишком много времени.
Вариант 1
SELECT *
FROM merged_person
WHERE (last_name, nvl(birthdate, '0001-01-01')) IN
(SELECT last_name, nvl(birthdate, '0001-01-01')
FROM merged_person
GROUP BY last_name, birthdate
HAVING COUNT(*) > 1
)
ORDER BY last_name, birthdate;
вариант 2
SELECT *
FROM merged_person
WHERE (last_name, nvl(to_char(birthdate, 'DD-MM-YYYY'), '00-00-0000')) IN
(SELECT last_name, nvl(to_char(birthdate, 'DD-MM-YYYY'), '00-00-0000')
FROM merged_person
GROUP BY last_name, birthdate
HAVING COUNT(*) > 1
)
ORDER BY last_name, birthdate;
Использование nvl(birthdate, '0001-01-01')
не смог отловить все случаи.
Есть ли способ улучшить производительность или другой способ совпадения нулевых дат рождения?
Edit:
Одинаковыми являются записи, которые имеют одинаковую фамилию и дату рождения, остальные поля не важны для сопоставления, но это имя, номер файла, идентификатор сотрудника, пол, набор информации о найме.
Поскольку я работаю с производственными данными, я не могу показать ни одной возвращенной строки.
Примеры * +1036 *
- Брюс Бэннер, 1966 года рождения, Эмпид 1234, мужчина
- Сара Баннер, 1966 года рождения, Эмпид 1345, женщина
- Энн Райс, Нуль, Эмпид 1134, женщина
- Бен Райс, Нуль, Эмпид 1153, мужчина
Определение баннера легко. Это рис, который вызывает проблемы.