Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Организация вложенного запроса   Найти похожие ветки 

 
_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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.061 c
15-1136460887
tim@eclear.net
2006-01-05 14:34
2006.01.29
Wanted - Delphi Developers in moscow


15-1136196244
PARUS
2006-01-02 13:04
2006.01.29
CPL


2-1137323085
Rubey
2006-01-15 14:04
2006.01.29
Сборка проекта


6-1129556311
WebSQLNeeder
2005-10-17 17:38
2006.01.29
Get или Post запросы через сокеты или TWebBrowser


2-1137152908
SarDoX
2006-01-13 14:48
2006.01.29
IE и delphi