Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
8-1124378522
Антон Олегыч
2005-08-18 19:22
2006.01.29
Построение векторов


3-1133424724
AloneAli
2005-12-01 11:12
2006.01.29
Перенос записей dbf 1C в другую dbf. Проблема с кодировкой


2-1136978003
Алексей Петухов
2006-01-11 14:13
2006.01.29
OLE automation


9-1124145529
keal
2005-08-16 02:38
2006.01.29
Отсечение невидимых граней в OpenGL


2-1137072542
pound
2006-01-12 16:29
2006.01.29
логотип





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский