Я пишу решение для пользователя, которое сопоставляет список телефонных номеров, которые они вводят с базой данных клиентов.
Пользователь должен ввести разделенный запятыми список телефонных номеров (целые числа) и запроснеобходимо сообщить пользователю, какие телефонные номера из их списка НЕ находятся в базе данных.
Единственный способ, которым я мог бы подумать, - это сначала создать подмножество NUMBER_LIST, которое включает все телефонные номера, к которым я могу присоединиться.а затем исключить этот список из того, что я возвращаю из своей базы данных клиентов.
WITH NUMBER_LIST AS (
SELECT INTEGERS
FROM (
SELECT level - 1 + 8000000000 INTEGERS
FROM dual
CONNECT BY level <= 8009999999-8000000000+1
)
WHERE INTEGERS IN (8001231001,8001231003,8001231234,8001231235,...up to 1000 phone numbers)
)
Проблема в том, что приведенный выше код прекрасно работает для создания моего подмножества, для чисел от 800-000-0000 до 800-999-9999.Номера телефонов в моем списке и базе данных клиентов могут иметь ЛЮБОЙ диапазон (не только 800 номеров).Я сделал это просто в качестве теста.Генерация подмножества из этого запроса занимает около 6 секунд.Если я создаю CONNECT BY LEVEL, чтобы включить все числа от 100-000-0000 до 999-999-9999, на которых мой запрос выполняется из памяти, чтобы создать такое большое подмножество (и я считаю, что создание огромного списка смехотворно излишнеи разбить его, используя мой оператор IN).
Проблема заключается в создании начального подмножества.Я могу обработать остальную часть запроса, но мне нужно иметь возможность генерировать подмножество чисел для запроса по моей базе данных клиентов из моего оператора IN.
Несколько вещей, которые нужно запомнить:
- У меня нет возможности сначала загружать числа во временную таблицу.Пользователь сам будет вводить оператор «IN (..., ..., ...)».
- Это должен быть один оператор, без дополнительных функций или объявлений переменных
- База данных - Oracle 10g, и я использую SQL Developer для создания запроса.
- Пользователь понимает, что он может ввести только 1000 чисел в оператор IN.Это должно быть достаточно надежно, чтобы выбрать любые 1000 номеров из всего диапазона кодов города.
- Конечный результат - получить список телефонных номеров, которых НЕ в базе данных.Простое NOT IN ... не будет работать, потому что это вернет, какие числа находятся в базе данных, но не в моем списке.
Как я могу сделать эту работу для всех чисел между 1000000000-9999999999 (или все 10-значный номер телефона США).Возможно, я ошибаюсь, создав свой первоначальный ОГРОМНЫЙ список, а затем исключаю все, кроме моего оператора IN, но я не уверен, куда идти.
Большое спасибо за вашу помощь заранее,Я многому научился у всех вас.