Запрос на исключение SQL - PullRequest
2 голосов
/ 27 июля 2011

Возможно ли в одном операторе SQL сделать следующее:

Используйте подмножество телефонных номеров в приглашении, например 8001231000-8001239999. Затем запросите мою базу данных, в которой есть телефонные номера, и верните, какие телефонные номера в исходном подмножестве НЕ находятся в моей базе данных? Моя база данных - Oracle 10g.

По сути, вместо того, чтобы возвращать, какие номера телефонов между 8001231000-8001239999, я хочу знать, какие номера телефонов между 8001231000-8001239999 НЕ находятся в моей базе данных.

Ответы [ 6 ]

4 голосов
/ 27 июля 2011

Предполагая, что номер телефона является НОМЕРОМ, вы можете сгенерировать список всех телефонных номеров в определенном диапазоне

 SELECT level - 1 + 8001231000
   FROM dual
CONNECT BY level <= 8001239999-8001231000+1

Затем вы можете присоединить этот список всех телефонных номеров в диапазоне к вашей фактической таблице телефонных номеров. Что-то вроде

WITH all_numbers AS (
  SELECT level - 1 + 8001231000 phone_number
    FROM dual
 CONNECT BY level <= 8001239999-8001231000+1
)
SELECT *
  FROM all_numbers a
 WHERE NOT EXISTS(
    SELECT 1
      FROM phone_numbers p
     WHERE a.phone_number = p.phone_number)
2 голосов
/ 27 июля 2011

Я бы загрузил временную таблицу со всеми 10000 телефонными номерами в диапазоне, который вы хотите проверить, и сделал бы исключающее соединение:

SELECT a.phone_number
FROM phone_numbers_i_want_to_check AS a
LEFT OUTER JOIN phone_numbers AS b
  ON a.phone_number = b.phone_number
WHERE b.phone_number IS NULL;
2 голосов
/ 27 июля 2011

Если ваши номера телефонов являются символами:

select * from mytable
where phone_number not between '8001231000' and '8001239999'

или если они числовые:

select * from mytable
where phone_number not between 8001231000 and 8001239999
0 голосов
/ 27 июля 2011

Примерно так:

SELECT numbers_array.num
  FROM (SELECT 8001231000 + LEVEL num 
          FROM dual 
       CONNECT BY LEVEL <= (8001239999 - 8001231000)
       ) numbers_array
 WHERE numbers_array.num NOT IN (SELECT number_you_have FROM your_table_of_numbers)

Создайте псевдотекстовый список всех возможных чисел и исключите из него существующие числа.

0 голосов
/ 27 июля 2011

Я не могу придумать способ сделать это с помощью одного выбора, но вы можете сделать это с помощью одной транзакции. В частности:

  • Создать временную таблицу со значениями в вашем диапазоне (должно быть возможно с одной таблицей создания и одной вставкой)
  • УДАЛИТЬ значения из вашей временной таблицы, которые существуют в вашей основной таблице
  • ВЫБЕРИТЕ значения из временной таблицы, которые остались

Редактировать: Ответ Билла Карвина лучше . Та же концепция с временной таблицей, но затем один выбор, чтобы извлечь значения, которые не существуют.

0 голосов
/ 27 июля 2011

Вы ищете оператора «НЕ В» с подзапросом, соответствующим этим телефонным номерам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...