Страница 1 из 1

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

Добавлено: 22 июн 2009, 18:32
Ulme
Ситуация такова:
Нужно получить все телефоны клиентов, которые делали заказ в период с date1 по date2, но не делали в другое время

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

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

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

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

Добавлено: 22 июн 2009, 19:37
WildSery
А конкретнее - покажи, как с "not exists" не получилось. Или до "not" не додумался?

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

Добавлено: 23 июн 2009, 13:07
Ulme
Покажу на примере что требуется:
нужно получить все телефоны, у которых время лежит в приделах от 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 для быстрого экспорта в эксель

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

Добавлено: 24 июн 2009, 09:17
Tonal
Вроде так:

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

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')
)

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

Добавлено: 24 июн 2009, 12:57
Ulme
Отлично, спасибо большое, скрипт работает

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

Добавлено: 25 июн 2009, 11:06
kdv
это не скрипт, это запрос. Скрипт это когда несколько sql-запросов. Не путайтесь в терминологии, иначе Вас не везде поймут правильно.