1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| with data as (
select b.idb, b.ordre, a.titre, b.deb, b.fin, c.idc
, lead(b.idb) over (partition by a.ida order by b.ordre) as next_idb
, lead(b.ordre) over (partition by a.ida order by b.ordre) as next_ordre
, lead(b.deb) over (partition by a.ida order by b.ordre) as next_deb
-- Si la ligne existe dans C (donc C non NULL)
-- Et fin est vrai
-- Et le deb suivant est faux
-- Alors on sélectionne la ligne suivante de B
-- Sinon NULL
, case when c.idb is not null
and b.fin = 'vrai'
and lead(b.deb) over (partition by a.ida order by b.ordre) = 'faux'
then lead(b.idb) over (partition by a.ida order by b.ordre)
end as next_idb_deb_fin
, case when c.idb is not null
and b.fin = 'vrai'
and lead(b.deb) over (partition by a.ida order by b.ordre) = 'faux'
then lead(b.ordre) over (partition by a.ida order by b.ordre)
end as next_ordre_deb_din
from table_a a
join table_b b on b.ida = a.ida
-- jointure externe pour permettre de lire la ligne suivante dans table_b (lead)
left join table_c c on c.idb = b.idb
)
-- COALESCE : si on a trouvé une ligne suivante candidate, sinon on prend la valeur existante dans C
select coalesce(next_idb_deb_fin, idb)
, coalesce(next_ordre_deb_din, ordre)
, titre
from data d
-- on refiltre les NULL de C générés par la jointure externe
where idc is not null; |
Partager