Requête SQL + boucle While
Bonjour à tous,
Je souhaiterais faire une requête me permettant de:
- ne garder que les enregistrements d'ordre 1 et de ne pas garder les enregistrements d'ordre 2 à partir du moment où ordre 1 est différent de Paris CDG.
- ne garder que les enregistrements d'ordre 2 et de ne pas garder les enregistrements d'ordre 1 à partir du moment où ordre 1 est égal à Paris CDG.
Ci-après les exemples simples de mes tables, de la requête déjà testée ainsi que des orientations auxquelles je pense:
table des lieux:
id_lieu |
nom_lieu |
id_proximite |
1 |
Arras |
1 |
2 |
Dunkerque |
1 |
3 |
Lens |
1 |
4 |
Amiens |
2 |
5 |
Beauvais |
2 |
6 |
Compiègne |
2 |
7 |
Chambéry |
3 |
8 |
Voiron |
3 |
9 |
Gap |
3 |
table des proximités
id_proximite |
nom_proximite |
id_ordre |
1 |
Lille_p |
1 |
2 |
Paris_p |
2 |
3 |
Grenoble_p |
3 |
table des ordres
id_ordre |
ordre |
id_aeroport |
1 |
1 |
1 |
1 |
2 |
2 |
1 |
3 |
3 |
2 |
1 |
2 |
2 |
2 |
1 |
2 |
3 |
3 |
3 |
1 |
3 |
3 |
2 |
1 |
3 |
3 |
2 |
table des aeroport
id_aeroport |
nom_aeroport |
1 |
Lille LIL |
2 |
Paris CDG |
3 |
Grenoble GNB |
Cette requête me permet de visualiser chaque lieu avec les deux premiers aéroports les plus proches récupérés selon les valeurs de la table ordre_aeroport. L'objectif étant de récupérer l'aéroport de ordre = 2 si Paris CDG a ordre = 1:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| SELECT *
from
(SELECT
lieu.nom_lieu,
proximite.nom_proximite,
ordre.ordre,
CASE
WHEN aeroport.nom_aeroport <> 'Paris CDG' and ordre.ordre = 1 then 1
WHEN aeroport.nom_aeroport = 'Paris CDG' and ordre.ordre = 1 then 0
ELSE 2
END as ordre_ss_paris,
aeroport.nom_aeroport
FROM lieu
LEFT JOIN proximite ON lieu.id_proximite = proximite.id_proximite
LEFT JOIN ordre ON proximite.id_ordre = ordre.id_ordre
LEFT JOIN aeroport ON ordre.id_aeroport = aeroport.id_aeroport
WHERE
ordre.ordre <3
) as requete
WHERE
CASE
WHEN requete.ordre = requete.ordre_ss_paris THEN requete.ordre
ELSE null
END |
Le résultat, présenté ci-dessous ne correspond pas à ce que je voudrais:
Les lignes noires correspondent aux localisations où l'ordre 1 doit être gardé.
Les lignes en rouge correspondent à l'ordre 2 que je ne veux pas voir apparaître dans le résultat final. Lignes que je pensais voir disparaître avec le filtre sur la vue.
Les lignes vertes correspondent au résultat attendu, à savoir je ne récupère que les ordre 2 à partir du moment où Paris CDG est en ordre 1
nom_lieu |
nom_proximite |
ordre |
ordre_ss_paris |
nom_aeroport |
Arras |
Lille_p |
1 |
1 |
Lille LIL |
Arras |
Lille_p |
2 |
2 |
Paris CDG |
Dunkerque |
Lille_p |
1 |
1 |
Lille LIL |
Dunkerque |
Lille_p |
2 |
2 |
Paris CDG |
Lens |
Lille_p |
1 |
1 |
Lille LIL |
Lens |
Lille_p |
2 |
2 |
Paris CDG |
Amiens |
Paris_p |
2 |
2 |
Lille LIL |
Beauvais |
Paris_p |
2 |
2 |
Lille LIL |
Compiègne |
Paris_p |
2 |
2 |
Lille LIL |
Chambéry |
Grenoble_p |
1 |
1 |
Grenoble GNB |
Chambéry |
Grenoble_p |
2 |
2 |
Lille LIL |
Voiron |
Grenoble_p |
1 |
1 |
Grenoble GNB |
Voiron |
Grenoble_p |
2 |
2 |
Lille LIL |
Gap |
Grenoble_p |
1 |
1 |
Grenoble GNB |
Gap |
Gernoble_p |
2 |
2 |
Lille LIL |
Je pense qu'il faudrait que je passe par une boucle de type:
Code:
1 2 3 4 5 6 7
| DECLARE
WHILE
BEGIN
SELECT
OFFSET
SET
END |
D'avance merci pour votre aide!