J'ai les tables suivantes:

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);
données:
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'));
et je voudrais le résultat:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
  CODE DESCR
------ -------
     1
     2 blanc
     3 gris
= chaque ligne de tmain avec le dernier "descr" de thist (dernier d'après thist.code, avec condition tdate is null)

Ma solution #1 (la meilleure que je connais):
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;
Ma solution #2:
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;
Avez vous quelque suggestions?