J'ai les tables suivantes:
données:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 create table tmain ( code number constraint pk_tmain primary key, descr varchar2 (100)); create table thist ( code number not null, maincode number not null, tdate date, descr varchar2 (100)); alter table thist add constraint fk_maincode foreign key (maincode) references tmain (code);
et je voudrais le résultat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 insert into tmain (code, descr) values (1, 'un'); insert into tmain (code, descr) values (2, 'deux'); insert into tmain (code, descr) values (3, 'trois'); insert into thist (code, maincode, descr, tdate) values (1, 2, 'noir', to_date ('15.01.2008', 'dd.mm.yyyy')); insert into thist (code, maincode, descr, tdate) values (2, 2, 'vert', null); insert into thist (code, maincode, descr, tdate) values (3, 2, 'blanc', null); insert into thist (code, maincode, descr, tdate) values (4, 3, 'gris', null); insert into thist (code, maincode, descr, tdate) values (5, 3, 'rouge', to_date ('20.01.2008', 'dd.mm.yyyy')); insert into thist (code, maincode, descr, tdate) values (6, 3, 'brun', to_date ('21.01.2008', 'dd.mm.yyyy'));
= chaque ligne de tmain avec le dernier "descr" de thist (dernier d'après thist.code, avec condition tdate is null)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 CODE DESCR ------ ------- 1 2 blanc 3 gris
Ma solution #1 (la meilleure que je connais):
Ma solution #2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 select m.code, h.descr from tmain m, thist h, (select distinct maincode, first_value (code) over (partition by maincode order by code desc) code from thist where tdate is null) w where w.maincode (+) = m.code and h.code (+) = w.code order by m.code;
Avez vous quelque suggestions?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select m.code, h.descr from tmain m, thist h where h.maincode (+) = m.code and ((h.code = (select max (i.code) from thist i where i.maincode = m.code and i.tdate is null)) or (not exists (select 1 from thist i where i.maincode = m.code and i.tdate is null))) order by m.code;
Partager