Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];

Вниз

Вложенный select   Найти похожие ветки 

 
-=alive=-   (2003-06-22 14:29) [0]

Добрый день всем .
Подскажите пожалуйста как реализовать данный запрос .Под Oracle все работает на ура , а вот под Interbase отказывается напроч .Где моя ошибка или может просто так нельзя .
Вот пример моего запроса ;
select f1,f2 from (
select t1 as f1,t1 as f2
from db1
union all
select -t2 as f1,-t2 as f2
from db2 )
Заранее всем спасибо .
Илья .


 
kaif   (2003-06-22 15:52) [1]

создай хранимую процедуру и делай select из нее.

/*создаешь один раз*/
create procedure AAA
returns(f1 integer, f2: integer) /*уточни тип данных*/
as
begin
for select t1,t1
from db1
into :f1, :f2 do
suspend;

for select -t2,-t2
from db2
into :f1, :f2 do
suspend;
end

/*из клиента посылаешь такой запрос*/
select f1, f2 from AAA


 
-=alive=-   (2003-06-23 10:45) [2]

Добрый день , спасибо за совет .А по другому что никак нельзя ?
Илья .


 
Johnmen   (2003-06-23 10:52) [3]

select t1 as f1,t1 as f2 from db1
union all
select -t2 as f1,-t2 as f2 from db2


 
Zacho   (2003-06-23 10:52) [4]


> -=alive=- © (23.06.03 10:45)

Можно. Вместо хранимой процедуры для этой цели можно сделать VIEW.
А SELECT ... FROM SELECT .. в IB нет.


 
Соловьев   (2003-06-23 10:54) [5]

а такой запрос разве не работает?

select t1 as f1,t1 as f2
from db1
union all
select -t2 as f1,-t2 as f2
from db2




 
-=alive=-   (2003-06-23 11:22) [6]

такой запрос работает , но не совсем коректно , по той причине что эти два запроса должны обьединиться в одном , так как связывать мне прийдется и 3 и 4 таблицы , а резкльтат должен быть в одной строке , а при этом запросе на каждый селект своя строка
select t1 as f1,t1 as f2
from db1
union all
select -t2 as f1,-t2 as f2
from db2


 
Johnmen   (2003-06-23 11:35) [7]

>-=alive=- © (23.06.03 11:22)

Странно... :) Вроде бы указанный тобой запрос возвращает более одной записи в общем случае...
Короче, приводи полностью запрос, который работает в Оракле.


 
-=alive=-   (2003-06-23 11:43) [8]

Вот запрос который работает под Ораклом .Мне нужно что то подобное написать и под Interbase
select ceh,nom_zak,i_pr,decode(ed_izm,1,"Т.ШТ.",decode(ed_izm,"2","ШТ.",decode(ed_izm,"3","Т.",decode(ed_izm,"4","КГ.","М2")))) as ed_izm,
kol_ostN,ves_ostN,
kol_pr,ves_pr,
kol_r,ves_r,
kol_rn,ves_rn,
kol_ostK,ves_ostK
from (
select ceh,nom_zak,i_pr,ed_izm,sum(kol_ostN) as kol_ostn,sum(ves_ostN) as ves_ostn,
sum(kol_pr) as kol_pr,sum(ves_pr) as ves_pr,
sum(kol_r) as kol_r,sum(ves_r) as ves_r,
sum(kol_rn) as kol_rn,sum(ves_rn) as ves_rn,
sum(kol_ostK) as kol_ostk,sum(ves_ostK) as ves_ostk
from (
-- остаток на начало
(select n.ceh,p.nom_zak,n.i_pr,n.ed_izm,p.kol as kol_ostN,p.ves_k as ves_ostN,
0 as kol_pr,0 as ves_pr,
0 as kol_r, 0 as ves_r,
0 as kol_rn, 0 as ves_rn,
0 as kol_ostK ,0 as ves_ostK
from prih_pl p,nsi_pl n
where p.dat_pr<:d1 and p.nom_zak=n.k_pr and p.dat_zak=n.dat_zak
and p.knd=:knd
union all
select n.ceh,r.nom_zak,n.i_pr,n.ed_izm,-r.kol as kol_ostN,-r.ves_k as ves_ostN,
0 as kol_pr, 0 as ves_pr,
0 as kol_r,0 as ves_r,
0 as kol_rn,0 as ves_rn,
0 as kol_ostK,0 as ves_ostK
from rash_pl r,nsi_pl n
where r.dat_dok<:d1 and r.nom_zak=n.k_pr and r.dat_zak=n.dat_zak and r.knd=:knd)
union all
-- приход за период
(select n.ceh,p.nom_zak,n.i_pr,n.ed_izm,0 as kol_ostN,0 as ves_ostN,
p.kol as kol_pr,p.ves_k as ves_pr,
0 as kol_r,0 as ves_r,
0 as kol_rn,0 as ves_rn,
0 as kol_ostK,0 as ves_ostK
from prih_pl p,nsi_pl n
where p.dat_pr between :d1 and :d2 and p.nom_zak=n.k_pr and p.dat_zak=n.dat_zak and p.knd=:knd)
union all
--расход за период
(select n.ceh,r.nom_zak,n.i_pr,n.ed_izm,0 as kol_ostN,0 as ves_ostN,
0 as kol_pr,0 as ves_pr,
r.kol as kol_r,r.ves_k as ves_r,
0 as kol_rn,0 as ves_rn,
0 as kol_ostK,0 as ves_ostK
from rash_pl r,nsi_pl n
where r.dat_dok between :d1 and :d2 and r.nom_zak=n.k_pr and r.dat_zak=n.dat_zak and r.knd=:knd)
union all
--расход за период на нужды
(select n.ceh,r.nom_zak,n.i_pr,n.ed_izm,0 as kol_ostN,0 as ves_ostN,
0 as kol_pr,0 as ves_pr,
0 as kol_r,0 as ves_r,
r.kol as kol_rn,r.ves_k as ves_rn,
0 as kol_ostK,0 as ves_ostK
from rash_pl r,nsi_pl n
where r.dat_dok between :d1 and :d2 and r.nom_zak=n.k_pr and r.dat_zak=n.dat_zak
and r.nom_dok IN ("ТР.ДПЧ") and r.knd=:knd)
union all
-- остаток на конец
(select n.ceh,p.nom_zak,n.i_pr,n.ed_izm,0 as kol_ostN,0 as ves_ostN,
0 as kol_pr, 0 as ves_pr,
0 as kol_r,0 as ves_r,
0 as kol_rn,0 as ves_rn,
p.kol as kol_ostK,p.ves_k as ves_ostK
from prih_pl p,nsi_pl n
where p.dat_pr<=:d2 and p.nom_zak=n.k_pr and p.dat_zak=n.dat_zak and p.knd=:knd
union all
select n.ceh,r.nom_zak,n.i_pr,n.ed_izm,0 as kol_ostN,0 as ves_ostN,
0 as kol_pr,0 as ves_pr,
0 as kol_r,0 as ves_r,
0 as kol_rn,0 as ves_rn,
-r.kol as kol_ostK,-r.ves_k as ves_ostK
from rash_pl r,nsi_pl n
where r.dat_dok<=:d2 and r.nom_zak=n.k_pr and r.dat_zak=n.dat_zak and r.knd=:knd))
group by ceh,nom_zak,i_pr,ed_izm)
where (kol_ostn<>0 or kol_pr<>0 or kol_r<>0 or kol_ostk<>0)


 
Johnmen   (2003-06-23 11:50) [9]

Все понятно. Придется писать хранимую процедуру, обеспечивающую необходимую логику.


 
-=alive=-   (2003-06-23 11:57) [10]

А у меня почему то предложенный выше вариант хр. процедыры не хочет работать .Если делаю execute выдает что Procedure unknown
Хотя как мне кажется все сделал правильно .
Вот что у меня получилось .
CREATE PROCEDURE "pr_ost" (
KOL_RS NUMERIC(15,2),
KOL_PR NUMERIC(15,2))
AS
begin
FOR SELECT KOL_PR FROM kart_prih
INTO :KOL_PR
do suspend;

FOR SELECT -KOL_RS FROM kart_rash
INTO :kol_rs
do suspend;
END


 
Danilka   (2003-06-23 11:59) [11]

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

и остатки на конец равны остаткам на начало + приход - расход, зачем двойную выборку делать?

а по переносу всего этого хозяйства под IB, тут надо думать, кроме всего прочего, неуверен что в IB есть функция decode.


 
-=alive=-   (2003-06-23 12:04) [12]

В IB функции декоде конечно же нет , а отгребает не долго так как данные всегда беруться только за месяц .
Буду рад новым советам , всем откликнушимся большое спасибо .
Илья .


 
Johnmen   (2003-06-23 12:05) [13]

>-=alive=- ©

Пуск->Программы->InterBase->Documentation->SQL Reference Help->CREATE PROCEDURE



 
Zacho   (2003-06-23 12:14) [14]


> -=alive=- © (23.06.03 11:57)

Если создавал ее как "pr_ost" , то и обращаться надо точно так же SELECT * FROM "pr_ost" (..)
Небольшой советик: не стоит заморачиваться с возможностью создания регистрозависимых имен объектов в IB 6, пиши CREATE PROCEDURE PR_OST .. и проблем гораздо меньше будет.
И еще: если ХП возвращает больше одной записи, то надо использовать не EXECUTE PROCEDURE, а SELECT .. FROM PROCEDURE_NAME(PARAMS). К тому же с EXECUTE PROCEDURE в IB6 и IBX могут быть проблемы - подробнее смотри http://www.ibase.ru/devinfo/ibstp.htm


 
Danilka   (2003-06-23 12:42) [15]

-=alive=- © (23.06.03 12:04)

>данные всегда беруться только за месяц
приход/расход - да, остатки - нет, у тебя остатки берутся за все месяца. с каждым месяцем доставать их будет все тяжелее.


 
-=alive=-   (2003-06-23 12:48) [16]

Danilka ©
Согласен конечно , но переделывать времени просто не хватает щас .В дальнейшем конечно постараюсь от таких заморочек уходить .А пока мне надо разобраться с IB и вложенными запросами .



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.007 c
8-55660
skiph
2003-03-26 12:07
2003.07.17
Прозрачный фон рисунка


1-55500
DBDev
2003-07-02 17:37
2003.07.17
Коллеги, чем бы занять юзера на время окрытия базы???


4-55884
Executor
2003-05-12 14:14
2003.07.17
Проблема с перерисовкой окна в WinXP


11-55488
Ал
2002-11-13 15:45
2003.07.17
Как в KOL


1-55558
Far
2003-07-06 22:07
2003.07.17
SysColors





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский