![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вложенный select [D6, IB6.x]
-=alive=- © (2003-06-22 14:29:00)Добрый день всем .
Подскажите пожалуйста как реализовать данный запрос .Под 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 )
Заранее всем спасибо .
Илья .
-=alive=- (2003-06-23 12:48:00) [1]Danilka ©
Согласен конечно , но переделывать времени просто не хватает щас .В дальнейшем конечно постараюсь от таких заморочек уходить .А пока мне надо разобраться с IB и вложенными запросами .
Danilka (2003-06-23 12:42:00) [2]-=alive=- © (23.06.03 12:04)
>данные всегда беруться только за месяц
приход/расход - да, остатки - нет, у тебя остатки берутся за все месяца. с каждым месяцем доставать их будет все тяжелее.
Zacho (2003-06-23 12:14:00) [3]
> -=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
Johnmen (2003-06-23 12:05:00) [4]>-=alive=- ©
Пуск->Программы->InterBase->Documentation->SQL Reference Help->CREATE PROCEDURE
-=alive=- (2003-06-23 12:04:00) [5]В IB функции декоде конечно же нет , а отгребает не долго так как данные всегда беруться только за месяц .
Буду рад новым советам , всем откликнушимся большое спасибо .
Илья .
Danilka (2003-06-23 11:59:00) [6]офигеть, интересно, а под ороклом он у тебя сколько отрабатывает?
мой тебе совет, используй для остатков какую-нибудь таблицу-регистр, которая заполняется либо по закрытию периода, либо еще как, иначе хлебнешь горя..
и остатки на конец равны остаткам на начало + приход - расход, зачем двойную выборку делать?
а по переносу всего этого хозяйства под IB, тут надо думать, кроме всего прочего, неуверен что в IB есть функция decode.
-=alive=- (2003-06-23 11:57:00) [7]А у меня почему то предложенный выше вариант хр. процедыры не хочет работать .Если делаю 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
Johnmen (2003-06-23 11:50:00) [8]Все понятно. Придется писать хранимую процедуру, обеспечивающую необходимую логику.
-=alive=- (2003-06-23 11:43:00) [9]Вот запрос который работает под Ораклом .Мне нужно что то подобное написать и под 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:35:00) [10]>-=alive=- © (23.06.03 11:22)
Странно... :) Вроде бы указанный тобой запрос возвращает более одной записи в общем случае...
Короче, приводи полностьюзапрос, который работает в Оракле.
-=alive=- (2003-06-23 11:22:00) [11]такой запрос работает , но не совсем коректно , по той причине что эти два запроса должны обьединиться в одном , так как связывать мне прийдется и 3 и 4 таблицы , а резкльтат должен быть в одной строке , а при этом запросе на каждый селект своя строка
select t1 as f1,t1 as f2
from db1
union all
select -t2 as f1,-t2 as f2
from db2
Соловьев (2003-06-23 10:54:00) [12]а такой запрос разве не работает?
select t1 as f1,t1 as f2
from db1
union all
select -t2 as f1,-t2 as f2
from db2
Johnmen (2003-06-23 10:52:00) [13]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:00) [14]
> -=alive=- © (23.06.03 10:45)
Можно. Вместо хранимой процедуры для этой цели можно сделать VIEW.
А SELECT ... FROM SELECT .. в IB нет.
-=alive=- (2003-06-23 10:45:00) [15]Добрый день , спасибо за совет .А по другому что никак нельзя ?
Илья .
kaif (2003-06-22 15:52:00) [16]создай хранимую процедуру и делай 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