घर
Top.Mail.Ru Yandeks.Metrika
फोरम: "मामले";
वर्तमान संग्रह: 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 ???
....

Вот как реализовать не знаю.
DBMS ओरेकल



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]


> देसीचाडो © (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
से
 (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
से
(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 Chet, min (oper_date), min(ID) as minId
from chet_table
group by Chet
) पी
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]

> सर्गेइएक्सन्यूम्एक्स © (13 02.12.05: 09) [55]

Точно: Пока стряпал из того, что было, эта строка оказалась в самом низу, я её и удалил за ненадобностью :)

З.Ы. Может кто ещё м на ОРАКЛЕ мелодию переложит? :)



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]


> सर्गेइएक्सन्यूम्एक्स © (13 02.12.05: 09) [37]


Значит попробую объяснить еще раз.
Есть программа - клиентский-модуль работающий с СУБД ОРАКЛЕ и соответственно с базой на ОРАКЛЕ. Программа под винду, есть меню и т.д. в меню есть разные пункты, так вот один из пункто "Документы", при выборе которого появляется окно с гридом. Грид содержит эти самые документы, на панели она есть кнопка "Фильтр", нажав ее появляется окно в котом можно задать для любого из полей отображенных на гриде значение по которому нужно фильтровать и указать операцию (=, <, >, >=, <=, !=, равно пустому, похоже, не похоже и т.д.) на этой же форме есть поле "Дополнительно" куда можно написать SQL код, вообще-то оно предназначено для других вещей, а именно для выполнения операций над полями фильтра, т.е. чел берет и перетаскивает туда поле для фильтрации, потом второе и ставит между ними знак операции, ну в общем получается расширенный фильтр, тем не менее поле прекрасно выполняет SQL. Поскольку сам грид уже имеет некоторый SQL, например:
चुनते हैं *
from oper

то к нему добавляются данные из фильтра, и получается
चुनते हैं *
from oper
कहाँ…।

так вот, если написать в дополнительно код вроде такого
id in (select id ...)

то, фильтр будет выглядет примерно так:
चुनते हैं *
from oper
कहाँ…।
and id in (select id ...)

Теперь о том за чем мне все это надо. Нужно значит выбрать за определенный период документы, по определенным счетам, с определенной суммой (все это легко задается в фильтре), причем выбрать по тем счетам, по которым они будут первой операцией, т.е. еще нужно залезть в счет и посмотреть а не первая ли это операция (чего в фильтре уже так просто не установишь).

Все это сделать можно и вручную, т.е. взять выбить список операций и потом входить в каждый счет и смотреть не первая ли это операция, но ведь это геморойно, операций много, делать прийдется раз в квартал, вот и решил попробовать.

Кстати говоря, это уже вторая задача, первая была отобрать операции по счетам клиентов у которые были зарегистрированны около 3-х месяцев назад, сделал все это таким же способом заработало успешно.



_Lucky_   (2005-12-02 13:42) [15]


> सर्गेइएक्सन्यूम्एक्स © (13 02.12.05: 09) [37]
> 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.62 एमबी
समय: 0.062 c
6-1129544218
stozlen
2005-10-17 14:16
2006.01.29
मानक खोलना आने वाले कनेक्शन बनाएँ संवाद


1-1134902392
इगोर स्टेपानोव
2005-12-18 13:39
2006.01.29
इनपुट के बाद स्ट्रिंगग्रिड सेल से कर्सर छवि का निष्कर्षण


2-1136455342
Sandman29
2006-01-05 13:02
2006.01.29
TDBGrid.DefaultDrawColumnCell


6-1129800785
बाज़ी
2005-10-20 13:33
2006.01.29
TClientSocket के साथ समस्या। "असंगत" घटना।


2-1136656262
(CHALING 32) SK i NER
2006-01-07 20:51
2006.01.29
तार के साथ काम करना





अफ्रीकी अल्बानियन अरबी भाषा अर्मेनियाई आज़रबाइजानी बस्क बेलारूसी बल्गेरियाई कैटलन सरलीकृत चीनी) चीनी पारंपरिक) क्रोएशियाई चेक डेनिश डच अंग्रेज़ी एस्तोनियावासी फिलिपिनो फिनिश फ्रेंच
गैलिशियन् जॉर्जियाई जर्मन यूनानी हाईटियन यहूदी हिंदी हंगरी आइसलैंड का इन्डोनेशियाई आयरिश इतालवी जापानी कोरियाई लात्वीयावासी लिथुआनियाई मेसीडोनियन मलायी मोलतिज़ नार्वेजियन
फ़ारसी पोलिश पुर्तगाली रोमानियाई रूसी सर्बियाई स्लोवाक स्लोवेनियाई स्पेनिश स्वाहिली स्वीडिश थाई तुर्की यूक्रेनी उर्दू वियतनामी वेल्श यहूदी बंगाली बोस्नियाई
सिबुआनो एस्पेरांतो गुजराती हौसा हमोंग ईग्बो जावानीस कन्नड़ खमेर लाओ लैटिन माओरी मराठी मंगोलियन नेपाली पंजाबी सोमाली तामिल तेलुगु योरूबा
ज़ुलु
Английский Французский Немецкий Итальянский Португальский Русский Испанский