我有两个表容器和LISTE_RECEPTD 我想选择值为enstock = 1并且存在于LISTE_RECEPTD表中的容器,其中最后一个收货日期为max(rec_date)。 注意到LISTE_RECEPTD中可以存在多次数字。
关系
竞赛表
LISTE_RECEPTD
我创建了一个程序 我有一个错误结果的问题。
begin
FOR SELECT conteneurs.numero FROM conteneurs
WHERE conteneurs.enstock=1
INTO :NUMERO
DO
BEGIN
FOR SELECT first 1 liste_receptd.recept_n ,max(liste_receptd.rec_date)
FROM liste_receptd
where liste_receptd.cont_numero=: NUMERO
group BY liste_receptd.recept_n
into :RECEPTION_N,:DATE_RECEPTION DO
SUSPEND;
suspend;
end
END
结果
感谢您的帮助
答案 0 :(得分:0)
我认为结果是好的,除了重复的行。如果您只想选择一行,只需删除suspend
命令之一。
.........
group BY liste_receptd.recept_n
into :RECEPTION_N,:DATE_RECEPTION DO
SUSPEND;
suspend; <-- REMOVE THIS
end
或删除第二个&#39; FOR&#39; 像这样:
begin
FOR SELECT conteneurs.numero FROM conteneurs
WHERE conteneurs.enstock=1
INTO :NUMERO
DO
BEGIN
SELECT first 1 liste_receptd.recept_n ,max(liste_receptd.rec_date)
FROM liste_receptd
where liste_receptd.cont_numero=:NUMERO
group BY liste_receptd.recept_n
into :RECEPTION_N,:DATE_RECEPTION;
SUSPEND;
END
end
答案 1 :(得分:0)
为此,您需要使用子查询查找每个库存项目的最高日期,然后选择与该日期和库存项目相关联的收件人:
select s.*, r.*
from stock s
inner join (
select max(rec_date) as max_rec_date, stockid
from receival
group by stockid
) latest
on latest.stockid = s.id
inner join receival r
on r.stockid = latest.stockid
and r.rec_date = latest.max_rec_date
如果您只想要最近收到的库存商品,可以简化为:
select s.*, latest.*
from stock s
inner join (
select max(rec_date) as max_rec_date, stockid
from receival
group by stockid
) latest
on latest.stockid = s.id
答案 2 :(得分:0)
我更改了视图&#34; LISTE_RECEPTD&#34;
select
reception.recept_n,
reception.rec_date,
reception_d.cont_numero,
conteneurs.enstock
from reception_d
left outer join reception on (reception_d.recept_n = reception.recept_n)
inner join conteneurs on (reception_d.cont_numero = conteneurs.numero)
因此,我有这个完成工作的查询
select distinct a.cont_numero NUMERO,a.rec_date DATE_RECEPTION ,
a.recept_n
from liste_receptd a
where
(a.enstock=1 )
and (a.rec_date)=(select first 1 max(d.rec_date) last_date from liste_receptd d where
a.cont_numero=d.cont_numero
group by d.rec_date
order by d.rec_date desc)
order by a.rec_date ,a.recept_n asc
;