IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Problème de "produit cartésien"


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut Problème de "produit cartésien"
    Aloha
    Bon il ne s'agit pas exactement d'un produit cartésien.
    Je construis une requête qui me permettra de lister un ensemble d'objet géométrique recouvrant à 80% un autre objet de la même table. Mais comme je calcule le taux de recouvrement à partir de la géométrie de l'intersection, j'ai deux fois le résultat dans mon select (une fois avec ID=1,ID=2 et une fois avec ID=2,ID=1).
    Ma requête :
    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
    SELECT                                                          /*+ ordered */
          E.GID,
           E."nom" AS NOM_EMPRISE,
           E."compleme",
           E."code_arc",
           E."commune",
           E2.GID,
           E2."nom" AS NOM_EMPRISE,
           E2."compleme",
           E2."code_arc",
           E2."commune"
      FROM E_EMPCTR E, E_EMPCTR E2
     WHERE     SDO_ANYINTERACT (E2.GEOMETRY, E.GEOMETRY) = 'TRUE'
           AND SDO_GEOM.
               SDO_AREA (SDO_GEOM.SDO_INTERSECTION (E.GEOMETRY, E2.GEOMETRY, 1),
                         1) >= 60 * SDO_GEOM.SDO_AREA (E.GEOMETRY, 1) / 100
           AND E.GID != E2.GID;
    pour l'instant j'ai donc comme résultat :

    E.GID E.NOM_EMPRISE E1.GID E1.NOM_EMPRISE
    ----------------------------------------------------------------------------------------
    2460 .ALLEE DES CHAMPENOIS.PROGRAMME 2009. 2056 .ALLEE DES CHAMPENOIS.
    2056 .ALLEE DES CHAMPENOIS. 2460 .ALLEE DES CHAMPENOIS.PROGRAMME 2009.
    ....
    Comment faire pour n'obtenir qu'une ligne puisqu'il s'agit de paire unique ?

    D'avance, merci,

    PS. Quelqu'un sait comment mettre en forme des tableaux dans les messages que l'on poste sur le forum ?

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Tu peux probablement t'en sortir la fonction analytique RANK OVER() sinon FIRST

  3. #3
    Membre confirmé Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut
    Merci orafrance.
    Mais je ne saisis pas en quoi ces expressions vont me permettre de purger mon résultat des couples en double ({A,B} et {B,A}).
    J'ai essayé le rank over, mais cela ne me renvoie pas la même valeur pour la ligne {A,B} et {B,A}.
    Quant au first, il semble être utilisable avec une fonction d'aggregat, que je n'utilise pas (puisque ce n'est pas une moyenne ou un min d'un des id que je souhaite récupérer).
    Ai-je mal compris quelque chose ?
    D'avance, merci,

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Changez votre critère :
    En :

  5. #5
    Membre confirmé Avatar de H.ile
    Profil pro
    Architecte de système d'information
    Inscrit en
    Janvier 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Janvier 2008
    Messages : 122
    Par défaut
    Aloha,

    Bon je m'en suis sorti autrement, en organisant les emprises selon leur aire et en ne renvoyant de résultat que pour l'emprise ayant la plus grande dans le couple.

    Maintenant je m'intéresse à d'autres objets toujours en relation avec des emprises (des polygones, des surfaces). Il s'agit de tronçons. Et si ma requête est correcte, je m'étonne de ne pas avoir de résultat au bout d'une heure de traitement.

    Quelqu'un a-t-il une idée ?

    D'avance, merci,

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    SELECT                                                             /*ORDERED*/
          S.GID,
           S.ID_EMPRISE,
           S.NOM_EMPRISE,
           S.LG,
           S.MAX_LG,
           R_VOIE.CODCOM,
           R_VOIE.CODRUE
      FROM    (   (SELECT T.GID,
                          E.GID AS ID_EMPRISE,
                          E."nom" AS NOM_EMPRISE,
                          E."commune" AS COMMUNE_EMPRISE,
                          SDO_GEOM.
                          SDO_LENGTH (
                             SDO_GEOM.
                             SDO_INTERSECTION (E.GEOMETRY, T.GEOMETRY, 0.1),
                             0.1)
                             AS LG,
                          MAX (
                             SDO_GEOM.
                             SDO_LENGTH (
                                SDO_GEOM.
                                SDO_INTERSECTION (E.GEOMETRY, T.GEOMETRY, 0.1),
                                0.1))
                          OVER (PARTITION BY E.GID)
                             AS MAX_LG
                     FROM E_EMPCTR E, R_TRONCO T
                    WHERE SDO_ANYINTERACT (E.GEOMETRY, T.GEOMETRY) = 'TRUE'
                          AND SDO_RELATE (
                                 E.Geometry,
                                 T.Geometry,
                                 'mask=covers+OVERLAPBDYDISJOINT+CONTAINS') =
                                 'TRUE'-- AND E.GID = 1239
                  ) S
               INNER JOIN
                  R_TRONCO_RELATION
               ON S.GID = R_TRONCO_RELATION.GID_D)
           INNER JOIN
              R_VOIE
           ON (    R_TRONCO_RELATION.GID_A = R_VOIE.GID
               AND R_TRONCO_RELATION.CLASS = 'R_VOIE'
               AND R_TRONCO_RELATION."NAME" = 'referent')
     WHERE LG = MAX_LG

  6. #6
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Pour tout ce qui est performance de requête, on ne peut rien dire si tu ne fournis pas beaucoup plus de renseignements, à savoir:

    - La volumétrie (en gros) des tables concernées
    - La volumétrie des résultats attendus
    - Si la 2ième est toute petite par rapport à la première, alors le ou les critères qui seront les plus discriminants
    - les index
    et surtout: Le plan d'exécution!

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/09/2007, 16h57
  2. Problème sur Request.ServerVariables("QUERY_STRING"
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 25/03/2005, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo