Форум: "Базы";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
ВнизОрганизация вложенного запроса Найти похожие ветки
← →
_Lucky_ (2005-11-30 13:50) [0]Как организовать запрос из результатов запроса?
Ну т.е. допустим есть запрос
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
← →
Desdechado © (2005-11-30 13:54) [1]select id from ( select ... )
← →
Sergey13 © (2005-11-30 14:01) [2]>Ну т.е. допустим есть запрос
Он не рабочий вроде. 8-)
>Вторым запросом надо из этого выбрать только ID,
А смысл? Разве что этот запрос тоже подзапросом оформлять.
← →
_Lucky_ (2005-12-02 09:08) [3]Во первых запрос был написан чисто формально, т.е. чтобы была понятна суть, и вопрос ставился не о работоспособности запроса.
Во вторых смысл есть, хотя могу и ошибатся. Смысл в следующем, на работе есть база, в которой есть формы представлений (ГРИДЫ) на каждом из представлений есть фильтр по всем полям грида, кроме того в этом фильтре есть поле "Дополнительно" в которое можно написать 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?
← →
_Lucky_ (2005-12-02 09:11) [4]
> Desdechado © (30.11.05 13:54) [1]
> select id from ( select ... )
Дольшое спасибо, обязательно попробую.
← →
Sergey13 © (2005-12-02 09:37) [5]2[3] _Lucky_ (02.12.05 09:08)
>а в чем ошибка-то?select ID, Chet, min (oper_date)
group by Chet
Если прям так, то будет ошибка синтаксиса. В Group By должны быть все поля из select кроме агрегатов. Если же добавить ID в Group By, то никакой группировки не будет, ибо ID, я подозреваю, уникальный.
>на работе есть база, в которой есть формы представлений (ГРИДЫ) на каждом из представлений есть фильтр по всем полям грида
Наверное есть программа по работе с базой у которой все это есть. Иначе я не въехал.
← →
ANB © (2005-12-02 09:40) [6]
> 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 написать и не парится.
← →
ЮЮ © (2005-12-02 09:44) [7]>А далее, чтобы они отобразились в гриде мне нужно "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
Учитывая "крутость ОРАКЛЕ" сделать такое же на нём не вызовет трудностей.
← →
ЮЮ © (2005-12-02 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"
) grouped, chet_table
where grouped.Chet = chet_table.Chet and grouped.min_oper_date = chet_table.oper_date
← →
Sergey13 © (2005-12-02 09:55) [9]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
← →
ANB © (2005-12-02 09:57) [10]Для оракла нужно только даты заменить с обычных строк на to_date(). Остальное так и выполнится.
← →
Dioman © (2005-12-02 09:57) [11]
> _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...
← →
ЮЮ © (2005-12-02 09:59) [12]>Sergey13 © (02.12.05 09:55) [9]
Точно: Пока стряпал из того, что было, эта строка оказалась в самом низу, я её и удалил за ненадобностью :)
З.Ы. Может кто ещё м на ОРАКЛЕ мелодию переложит? :)
← →
dioman © (2005-12-02 12:25) [13]... для Вашего случая полный запрос
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
← →
_Lucky_ (2005-12-02 13:39) [14]
> 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-х месяцев назад, сделал все это таким же способом заработало успешно.
← →
_Lucky_ (2005-12-02 13:42) [15]
> Sergey13 © (02.12.05 09:37) [5]
> 2[3] _Lucky_ (02.12.05 09:08)
> >а в чем ошибка-то?
> select ID, Chet, min (oper_date)
> group by Chet
Да реально ошибка, нашел сам, когда оракле заматерился, но все равно большое спасибо.
Однако кода дающего нужный результат так и не получилось написать.
← →
Sergey13 © (2005-12-02 13:51) [16]2 [15] _Lucky_ (02.12.05 13:42)
> Однако кода дающего нужный результат так и не получилось написать.
Запрос от ЮЮ с учетом [9] и [10] должен вроде дать искомое.
Кроме того можно попробовать доработать до нужной кондиции [13] - там надо добавить внешний запрос select Id from. Он вроде должен дать нужное. Но я не пробовал такие аналитические функции (руки не доходили все), но конструкция рабочая.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.03 c