![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Организация вложенного запроса [D7]
_Lucky_ © (2005-11-30 13:50:00)Как организовать запрос из результатов запроса?
Ну т.е. допустим есть запрос
select ID, Chet, min (oper_date)
from chet_table
where oper_date > 10.10.2005 and oper_date < 10.11.2005
group by Chet
Вторым запросом надо из этого выбрать только ID,
т.е.
select ID
from ???
....
Вот как реализовать не знаю.
СУБД Oracle
Sergey13 (2005-12-02 13:51:00) [1]2 [15] _Lucky_ (02.12.05 13:42)
> Однако кода дающего нужный результат так и не получилось написать.
Запрос от ЮЮ с учетом [9] и [10] должен вроде дать искомое.
Кроме того можно попробовать доработать до нужной кондиции [13] - там надо добавить внешний запрос select Id from. Он вроде должен дать нужное. Но я не пробовал такие аналитические функции (руки не доходили все), но конструкция рабочая.
_Lucky_ (2005-12-02 13:42:00) [2]
> Sergey13 © (02.12.05 09:37) [5]
> 2[3] _Lucky_ (02.12.05 09:08)
> >а в чем ошибка-то?
> select ID, Chet, min (oper_date)
> group by Chet
Да реально ошибка, нашел сам, когда оракле заматерился, но все равно большое спасибо.
Однако кода дающего нужный результат так и не получилось написать.
_Lucky_ (2005-12-02 13:39:00) [3]
> Sergey13 © (02.12.05 09:37) [5]
Значит попробую объяснить еще раз.
Есть программа - клиентский-модуль работающий с СУБД ОРАКЛЕ и соответственно с базой на ОРАКЛЕ. Программа под винду, есть меню и т.д. в меню есть разные пункты, так вот один из пункто "Документы", при выборе которого появляется окно с гридом. Грид содержит эти самые документы, на панели она есть кнопка "Фильтр", нажав ее появляется окно в котом можно задать для любого из полей отображенных на гриде значение по которому нужно фильтровать и указать операцию (=, <, >, >=, <=, !=, равно пустому, похоже, не похоже и т.д.) на этой же форме есть поле "Дополнительно" куда можно написать SQL код, вообще-то оно предназначено для других вещей, а именно для выполнения операций над полями фильтра, т.е. чел берет и перетаскивает туда поле для фильтрации, потом второе и ставит между ними знак операции, ну в общем получается расширенный фильтр, тем не менее поле прекрасно выполняет SQL. Поскольку сам грид уже имеет некоторый SQL, например:
select *
from oper
то к нему добавляются данные из фильтра, и получается
select *
from oper
where ....
так вот, если написать в дополнительно код вроде такого
id in (select id ...)
то, фильтр будет выглядет примерно так:
select *
from oper
where ....
and id in (select id ...)
Теперь о том за чем мне все это надо. Нужно значит выбрать за определенный период документы, по определенным счетам, с определенной суммой (все это легко задается в фильтре), причем выбрать по тем счетам, по которым они будут первой операцией, т.е. еще нужно залезть в счет и посмотреть а не первая ли это операция (чего в фильтре уже так просто не установишь).
Все это сделать можно и вручную, т.е. взять выбить список операций и потом входить в каждый счет и смотреть не первая ли это операция, но ведь это геморойно, операций много, делать прийдется раз в квартал, вот и решил попробовать.
Кстати говоря, это уже вторая задача, первая была отобрать операции по счетам клиентов у которые были зарегистрированны около 3-х месяцев назад, сделал все это таким же способом заработало успешно.
dioman (2005-12-02 12:25:00) [4]... для Вашего случая полный запрос
select ID, Chet, first_value(oper_date) over (partition by chet order by oper_date)
from chet_table
where oper_date > 10.10.2005 and oper_date < 10.11.2005
ЮЮ (2005-12-02 09:59:00) [5]>Sergey13 © (02.12.05 09:55) [9]
Точно: Пока стряпал из того, что было, эта строка оказалась в самом низу, я её и удалил за ненадобностью :)
З.Ы. Может кто ещё м на ОРАКЛЕ мелодию переложит? :)
ANB (2005-12-02 09:57:00) [6]Для оракла нужно только даты заменить с обычных строк на to_date(). Остальное так и выполнится.
Dioman (2005-12-02 09:57:00) [7]
> _Lucky_ (02.12.05 09:08) [3]
чтобы выбрать ид для каждой группы и получить все иды... то так
select * from
(
select Chet, min (oper_date), min(ID) as minId
from chet_table
group by Chet
) p
inner join chet_table on p.minId = chet_table.ID
тогда получишь каждому ид соответствие минимального oper_date в группе где присутствует этот ид.
для оракла есть способ красивее для таких целей.
для такого нужно пользвать аналитические функции
select ID, Chet, first_value(oper_date) over (partition by chet order by oper_date)
from...
Sergey13 (2005-12-02 09:55:00) [8]2[8] ЮЮ © (02.12.05 09:50)
>Сорри, ошибся в имени таблицы:
Не только. 8-)
select Id
from
(select Chet, min (oper_date) min_oper_date
from chet_table
where oper_date > '20051010' and oper_date < '20051110'
group by Chet
) grouped, chet_table
where grouped.Chet = chet_table.Chet and grouped.min_oper_date = chet_table.oper_date
ЮЮ (2005-12-02 09:50:00) [9]Сорри, ошибся в имени таблицы:
select Id
from
(select Chet, min (oper_date) min_oper_date
from chet_table
where oper_date > '20051010' and oper_date < '20051110'
) grouped, chet_table
where grouped.Chet = chet_table.Chet and grouped.min_oper_date = chet_table.oper_date
ЮЮ (2005-12-02 09:44:00) [10]>А далее, чтобы они отобразились в гриде мне нужно "ID IN (SELECT ID ....)", >возможно не понятно объяснил, но я старался :-)
Дело в том, что запросом с group by Chet получить Id невозможно. Сеначала ты можешь получить Chet и min (oper_date), затем уже пытаться найти те Id для которых Chet и min (oper_date) будут именно такими, что и в запросе с группировеой, при этом следует учесть, что для конкретного Chet может оказаться несколько записей у которых oper_date = min (oper_date) , если конечно нет ограничения, что в один oper_date возможна только одна запись с заданным Chet.
На MS SQL это было бы так:
select Id
from
(select Chet, min (oper_date) min_oper_date
from chet_table
where oper_date > '20051010' and oper_date < '20051110'
) grouped, oper_date
where grouped.Chet = oper_date.Chet and grouped.min_oper_date = oper_date.oper_date
Учитывая "крутость ОРАКЛЕ" сделать такое же на нём не вызовет трудностей.
ANB (2005-12-02 09:40:00) [11]
> select ID, Chet, min (oper_date)
> from chet_table
> where oper_date > 10.10.2005 and oper_date < 10.11.2005
> group by Chet
А зачем тут запрос с группировкой, если потом все равно одни ID оставишь ?
Проще было distinct написать и не парится.
Sergey13 (2005-12-02 09:37:00) [12]2[3] _Lucky_ (02.12.05 09:08)
>а в чем ошибка-то?
select ID, Chet, min (oper_date)
group by Chet
Если прям так, то будет ошибка синтаксиса. В Group By должны быть все поля из select кроме агрегатов. Если же добавить ID в Group By, то никакой группировки не будет, ибо ID, я подозреваю, уникальный.
>на работе есть база, в которой есть формы представлений (ГРИДЫ) на каждом из представлений есть фильтр по всем полям грида
Наверное есть программа по работе с базой у которой все это есть. Иначе я не въехал.
_Lucky_ (2005-12-02 09:11:00) [13]
> Desdechado © (30.11.05 13:54) [1]
> select id from ( select ... )
Дольшое спасибо, обязательно попробую.
_Lucky_ (2005-12-02 09:08:00) [14]Во первых запрос был написан чисто формально, т.е. чтобы была понятна суть, и вопрос ставился не о работоспособности запроса.
Во вторых смысл есть, хотя могу и ошибатся. Смысл в следующем, на работе есть база, в которой есть формы представлений (ГРИДЫ) на каждом из представлений есть фильтр по всем полям грида, кроме того в этом фильтре есть поле "Дополнительно" в которое можно написать SQL. Поскольку нужной формы в функционале этой программы не оказалось, я решил написать свой кусочек SQL, вся проблема в том, что в дополнительно я могу писать вещи типа "ID IN (SELECT ID ....)", соответственно, чтобы отпаботал ИН нужно, чтобы в последнем селекте было одно поле, иначе ОРАКЛЕ ругается. Ну и значит получается, что сначала я выбираю те записи которые мне нужны примерно таким запросом:
select ID, Chet, min (oper_date)
from chet_table
where oper_date > 10.10.2005 and oper_date < 10.11.2005
group by Chet
А далее, чтобы они отобразились в гриде мне нужно "ID IN (SELECT ID ....)", возможно не понятно объяснил, но я старался :-)
ЗюЫю а в чем ошибка-то? кроме where oper_date > 10.10.2005 and oper_date < 10.11.2005?
Sergey13 (2005-11-30 14:01:00) [15]>Ну т.е. допустим есть запрос
Он не рабочий вроде. 8-)
>Вторым запросом надо из этого выбрать только ID,
А смысл? Разве что этот запрос тоже подзапросом оформлять.
Desdechado (2005-11-30 13:54:00) [16]select id from ( select ... )