#1 Fri 21 March 2008 17:38
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
[oracle] récupérer une liste de doublons
Aloha
Nous sommes sous Oracle Spatial et nous travaillons sur l'enrichissement de notre logiciel de consultation du PLU par les instructeurs de l'urba.
Nous avons ce genre de requête pour croiser différentes table
Code:
/*Rq avec le critère S, S/S >0.1*/ Select PARC.GID, RZPOS."zonage_U" as "ZONAGE", RZPOS."zone_UrG" as "ZONE", '51'||substr(PARC.IDENT,1,3) as "INSEE", ltrim(substr(PARC.IDENT,7,2),'0') as "SECTION", ltrim(substr(PARC.IDENT,9,4),'0') as "NUMERO", /*select count(PARC.GID)*/ round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(PARC.GEOMETRY,0.005)))*100,3) " S INTERSECTION (%)", round(SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/1000000,3) " S INTERSECTION (m2)", round((SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY,0.005),0.1)*0.2),4) "Px0.4/2 INT", round(SDO_GEOM.SDO_AREA(PARC.GEOMETRY, 0.005)/1000000,2) "S PARCELLE en m2", round(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY,0.005),0.1)/1000,4) "P INTERSECTION (m)" from A_REIMS.PP_RZPOS RZPOS, A_REIMS.PCI_PARC PARC, A_REIMS.PP_EMCTR EMP where EMP."numero_e"='10' and SDO_FILTER(PARC.GEOMETRY,EMP.GEOMETRY)='TRUE' and (SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=contains querytype=WINDOW')='TRUE' OR SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=covers querytype=WINDOW')='TRUE' OR SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=overlapbdyintersect querytype=WINDOW')='TRUE' OR SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=equal querytype=WINDOW')='TRUE') and round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(PARC.GEOMETRY,0.005)))*100,3)>0.1 and round(SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/1000000,3)>0.1 and substr(PARC.IDENT,1,3)='454';
Ce que je souhaite c'est lancer cette requête mais qu'elle ne me sorte que les enregistrements en double (i.e. même section, même numéro de parcelle) et non tous les enregistrements. Mais tous les doublons avec les valeurs de S intersection, de Zonage_U,...
Quelqu'un a-t'il une idée ?
Une fois la requête exécutée nous utilisons les résultats pour visualiser dans APIC les collections d'objets posant problèmes et arbitrer.
D'avance merci,
Dernière modification par Brindavoine (Fri 21 March 2008 17:39)
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#2 Tue 25 March 2008 13:44
- Cartosig
- Participant assidu
- Date d'inscription: 16 Oct 2006
- Messages: 222
Re: [oracle] récupérer une liste de doublons
La méthode classique pour sortir les doublons d'une requête c'est de faire un group by ... having count(*) > 1, mais vous la connaissez surement...
Etant donné la longueur et la complexité de votre requête ça va être assez pénible a écrire, de plus comme il y a des requêtes spatiales je pense que ça ne fonctionnera tout simplement pas !
Une solution possible pourrait être d'englober la requête dans un select sur un seul des champs (le plus discriminant évidemment), et de faire le group by sur ce champ. Par exemple :
Code:
Select PARC.GID, count(*) from ([i]votre requete[/i]) group by PARC.GID having count(*)>1
C'est une piste, je ne garanti pas que ça fonctionne...
Je vous conseille de poster votre question sur le forum Oracle de Developpez.com !
Hors ligne
#3 Wed 26 March 2008 10:51
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: [oracle] récupérer une liste de doublons
Solution testée.
Code:
/*Rq avec le critère pour ressortir les doublons*/ Select PARC.GID, count(*) from A_REIMS.PCI_PARC PARC, (select PARC.GID, RZPOS."zonage_U" as "ZONAGE", RZPOS."zone_UrG" as "ZONE", '51'||substr(PARC.IDENT,1,3) as "INSEE", ltrim(substr(PARC.IDENT,7,2),'0') as "SECTION", ltrim(substr(PARC.IDENT,9,4),'0') as "NUMERO", round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(PARC.GEOMETRY,0.005)))*100,3) " S INTERSECTION (%)", round(SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/1000000,3) " S INTERSECTION (m2)", round((SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY,0.005),0.1)*0.2),4) "Px0.4/2 INT", round(SDO_GEOM.SDO_AREA(PARC.GEOMETRY, 0.005)/1000000,2) "S PARCELLE en m2", round(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY,0.005),0.1)/1000,4) "P INTERSECTION (m)" from A_REIMS.PP_RZPOS RZPOS, A_REIMS.PCI_PARC PARC, A_REIMS.PP_EMCTR EMP where EMP."numero_e"='10' and SDO_FILTER(PARC.GEOMETRY,EMP.GEOMETRY)='TRUE' and (SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=contains querytype=WINDOW')='TRUE' OR SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=covers querytype=WINDOW')='TRUE' OR SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=overlapbdyintersect querytype=WINDOW')='TRUE' OR SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=equal querytype=WINDOW')='TRUE') and round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(PARC.GEOMETRY,0.005)))*100,3)>0.1 and round(SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/1000000,3)>0.1 and substr(PARC.IDENT,1,3)='454') group by PARC.GID having count(*)>1 ;
Problème j'obtiens toutes mes parcelles. Toutes les parcelles de mon agglomération alors qu'il y a deux trois critères de requêtes géographiques. Et le count est égal au nombre de parcelles intersectant l'emprise.
Une idée ?
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#4 Wed 26 March 2008 11:44
- Cartosig
- Participant assidu
- Date d'inscription: 16 Oct 2006
- Messages: 222
Re: [oracle] récupérer une liste de doublons
J'ai fait une erreur dans mon message précédent. La requête serait plutôt :
Code:
Select A.GID, count(*) from ([i]votre requete[/i]) A group by A.GID having count(*)>1
L'idée étant de regrouper par entité (ID de commune par ex) les enregistrement ramenés plus d'une fois par le Select de la requête fille.
(dans le test que vous avez fait, le select ramène toutes les PARC.GID car vous faite un select sur deux ensembles : toute la table PARC d'abord, plus l'ensemble composé par votre requête. Mais il n'y a pas de critère de corrélation entre ces deux ensembles)
Dernière modification par Cartosig (Wed 26 March 2008 11:45)
Hors ligne