Bonjour,
Je dois faire une requête afin de trouver les chevauchements d'adresses dans des bouts de rues.
Voici la requête de base sur toute la table
(Voir fichier attaché requeteBase.jpg)
Code : Sélectionner tout - Visualiser dans une fenêtre à part select * from voi_troncon_ln_v where n_voie is not null
En considérant les adresses par rue (distinct t_voie, l_voie, n_voie,d_voie ou group by t_voie, l_voie, n_voie,d_voie ), on doit déterminer si dans l'ensemble des enregistrements, il y a des adresses (champs D_GCH, F_GCH, D_DRT, F_DRT) qui sont incluses dans d'autres enregistrements.
D_GCH=> Début gauche
F_GCH=> Fin gauche
D_DRT=> Début droit
F_DRT=> Fin droit
on n'a pas à distinguer la gauche de la droite mais on doit distinguer les pairs des impairs (mod(b.d_drt,2) = mod(a.d_drt,2) ou mod(b.d_gch,2) = mod(a.d_gch,2)).
Par exemple, la requête
montre les enregistrements dans l'image suivante, sur une rue en particulier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 select * from voi_troncon_ln_v where id_trc in (520774,503975,508874, 503261, 503264, 503971, 503216)
Ce qu'il faut considérer dans la requête:
-Le ID_TRC=503216 n'entre pas dans la comparaison car il n'y a pas d'adresse associé à ce bout de rue (les champs D_GCH, F_GCH, D_DRT, F_DRT sont tous à 0). On peut donc mettre dans la requête and not(d_gch=0 and d_drt=0). Si les deux sont à 0, impossible qi'il y ait chevauchement.
-Le ID_TRC=503971 côté droit (411 à 411) n'entre pas en conflit (pas de chevauchement) entre le tronçon ID_TRC=508874 (368 à 508) car le premier est impair alors que le second est pair, de même que les autres de l'exemple. Mais le côté gauche (400 à 400) chevauche le 508874 (368 à 508).
-Finalement, on voit que le tronçon ID_TRC=508874 entre en conflit avec les tronçons ID_TRC=520774, 503975, 503261 et 503264. L'adresse 380 entre sur les tronçons 520774, 503975 et 508874. C'est ce qu'il faut trouver pour l'ensemble de la table. De même, l'adresse 420 entre sur les tronçons 508874 ET 503261. Et finalement, l'adresse 460 entre sur les tronçons 503264 ET 508874.
Comment peut-on constituer la requête qui va faire en sorte qu'on va trouver les chevauchements pour tous les bouts de rues de cette table?
Jusqu'à maintenant, j'ai trouvé ça comme requête mais ça ne semble pas fonctionner:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 select a.* from voi_troncon_ln_v a where a.objectid > (select min(b.objectid) from voi_troncon_ln_v b where b.t_voie = a.t_voie and b.l_voie = a.l_voie and b.n_voie = a.n_voie and b.d_voie = a.d_voie and (( ( b.d_drt>0 and mod(b.d_drt,2) = mod(a.d_drt,2) and (b.d_drt between a.d_drt and nvl(a.f_drt,a.d_drt) or b.f_drt between a.d_drt and nvl(a.f_drt,a.d_drt)) )) OR ( ( b.d_gch>0 and mod(b.d_gch,2) = mod(a.d_gch,2) and (b.d_gch between a.d_gch and nvl(a.f_gch,a.d_gch) or b.f_gch between a.d_gch and nvl(a.f_gch,a.d_gch)) )) ) ) and not(a.d_gch=0 and a.d_drt=0)
Partager