Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
Ulme
- Сообщения: 16
- Зарегистрирован: 27 июн 2008, 14:31
Сообщение
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
Сообщение
kdv » 22 июн 2009, 18:58
гм, сначала решил сослаться на
http://www.ibase.ru/devinfo/joins.htm
но потом понял, что не до конца въехал в вопрос. Насколько я понимаю, проблема в том, что сначала нужно выбрать одно, а потом оттуда исключить другое. А как не вышло?
-
WildSery
- Заслуженный разработчик
- Сообщения: 1738
- Зарегистрирован: 05 июн 2006, 16:19
Сообщение
WildSery » 22 июн 2009, 19:37
А конкретнее - покажи, как с "not exists" не получилось. Или до "not" не додумался?
-
Ulme
- Сообщения: 16
- Зарегистрирован: 27 июн 2008, 14:31
Сообщение
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
Сообщение
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
Сообщение
Ulme » 24 июн 2009, 12:57
Отлично, спасибо большое, скрипт работает
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 25 июн 2009, 11:06
это не скрипт, это запрос. Скрипт это когда несколько sql-запросов. Не путайтесь в терминологии, иначе Вас не везде поймут правильно.