Форум: "Базы";
Текущий архив: 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