Исключить из результата select'a ненужные записи

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Ulme
Сообщения: 16
Зарегистрирован: 27 июн 2008, 14:31

Исключить из результата select'a ненужные записи

Сообщение Ulme » 22 июн 2009, 18:32

Ситуация такова:
Нужно получить все телефоны клиентов, которые делали заказ в период с date1 по date2, но не делали в другое время

select distinct "Phone"
from "Orders" where ... другие условия отбора ... далее идет ограничение "Time" - период с date1 по date2. Дальше не могу разобратся, как исключить те телефоны клиентов, которые делали заказы и во время заданного периода, и за его границами. Пробовал exist'ами, и not in, и пытался подсчитывать кол-во записей за границами периода - если 0, то телефон попадает в результат селекта, пока ничего не получается :(

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Исключить из результата select'a ненужные записи

Сообщение kdv » 22 июн 2009, 18:58

гм, сначала решил сослаться на
http://www.ibase.ru/devinfo/joins.htm
но потом понял, что не до конца въехал в вопрос. Насколько я понимаю, проблема в том, что сначала нужно выбрать одно, а потом оттуда исключить другое. А как не вышло?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Исключить из результата select'a ненужные записи

Сообщение WildSery » 22 июн 2009, 19:37

А конкретнее - покажи, как с "not exists" не получилось. Или до "not" не додумался?

Ulme
Сообщения: 16
Зарегистрирован: 27 июн 2008, 14:31

Re: Исключить из результата select'a ненужные записи

Сообщение Ulme » 23 июн 2009, 13:07

Покажу на примере что требуется:
нужно получить все телефоны, у которых время лежит в приделах от 1 января до 1 мая 2009 года, и в то же время они отсутствуют за границами периода.
В таблице есть

9876543 - 1.03.2009
9876543 - 2.03.2009
9876543 - 3.03.2009 - Все появления этого номера в записи соответствуют периоду, поэтому он попадает в результат
8765432 - 1.06.2009
8765432 - 2.06.2009
7654321 - 1.04.2009
6543210 - 1.02.2009 - в периоде
6543210 - 1.12.2008 - за периодом, поэтому этот номер не выдаем в результат

Правильный результат:
9876543
7654321.

Запрос делал такой

Код: Выделить всё

select distinct "Phone"
from "Orders" 
where {условия проверки корректности номера} and
       not exists (select "Phone" from "Orders" where
       (("Start_Time" < '1.01.2009') or ("Start_Time" > '1.05.2009')) )
и такой

Код: Выделить всё

select distinct "Phone"
from "Orders" 
where {условия проверки корректности номера} and
      (("Start_Time" > '1.01.2009') and ("Start_Time" < '1.05.2009'))
      and "Phone" not in (select "Phone" from "Orders" where
       (("Start_Time" < '1.01.2009') and ("Start_Time" > '1.05.2009')) )

Оптимизированность запрос не суть важна, запрос будет проводится вручную, редко, в разных фирмах в IBexperte для быстрого экспорта в эксель

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Re: Исключить из результата select'a ненужные записи

Сообщение Tonal » 24 июн 2009, 09:17

Вроде так:

Код: Выделить всё

select distinct "Phone"
from "Orders" OO
where {условия проверки корректности номера} and
  "Start_Time" bet '1.01.2009' and '1.05.2009' and not exict (
    select 1 from "Orders" OI where OO."Phone" = OI."Phone" and 
      ("Start_Time" < '1.01.2009' or "Start_Time" > '1.05.2009')
)

Ulme
Сообщения: 16
Зарегистрирован: 27 июн 2008, 14:31

Re: Исключить из результата select'a ненужные записи

Сообщение Ulme » 24 июн 2009, 12:57

Отлично, спасибо большое, скрипт работает

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Исключить из результата select'a ненужные записи

Сообщение kdv » 25 июн 2009, 11:06

это не скрипт, это запрос. Скрипт это когда несколько sql-запросов. Не путайтесь в терминологии, иначе Вас не везде поймут правильно.

Ответить