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 :

[10gR2] Requête UNION et connaître le critère discriminant


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 [10gR2] Requête UNION et connaître le critère discriminant
    Aloha

    Je souhaite connaître la liste de mes arrêts de bus proche d'alignements d'arbres et/ou implantés dans le périmètre de protection des bâtiments de France.
    Je peux donc établir ma requête ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT TP.GID,
           TP.CODE_POT
     
           FROM TP_ARRET TP, PO_RALAR AL
     WHERE SDO_WITHIN_DISTANCE (TP.GEOMETRY, AL.GEOMETRY, 'distance = 10') =
              'TRUE'
    UNION 
    SELECT TP.GID,
           TP.CODE_POT
     
      FROM TP_ARRET TP, PP_RMHIP HIS
     WHERE SDO_RELATE (TP.GEOMETRY, HIS.GEOMETRY, 'mask=inside') = 'TRUE';
    Oui mais ce n'est pas uffisant parce que j'aimerai savoir si l'arrêt se trouve à proximité de l'alignement, dans le périmètre ou les deux. Bref j'aimerai avoir une colonne 'ALIGNEMENT' avec O/N et une colonne 'HISTO' avec O/N.

    J'ai essayé quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT TP.GID,
           TP.CODE_POT,
           'OUI' AS ALIGN, NULL AS MHIS
           FROM A_REIMS.TP_ARRET TP, A_REIMS.PO_RALAR AL
     WHERE SDO_WITHIN_DISTANCE (TP.GEOMETRY, AL.GEOMETRY, 'distance = 10') =
              'TRUE'
    UNION 
    SELECT TP.GID,
           TP.CODE_POT,
           NULL, 'OUI'
      FROM A_REIMS.TP_ARRET TP, PP_RMHIP HIS
     WHERE SDO_RELATE (TP.GEOMETRY, HIS.GEOMETRY, 'mask=inside') = 'TRUE';
    Mais les deux colonnes renvoyant des valeurs uniques pour chacuns des enregistrements des requêtes select je n'ai au final pas l'union au sens ou je l'aimerai.

    Comment faire ?

    Merci d'avance,

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    1. Ajouter des DISTINCT dans chaque SELECT si la requête est susceptible de produire des doublons.

    2. Etant donné qu'il va bien falloir choisir une des deux valeurs à garder (eh oui), ajouter une condition NOT EXISTS dans le SELECT "secondaire". Probablement en passant par un WITH pour faciliter la factorisation.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    mais pourquoi passer par un union alors que des jointures externes suffiraient au vu de :

    Mais les deux colonnes renvoyant des valeurs uniques pour chacuns des enregistrements des requêtes select

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Grouper et prendre le max des 2 colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT tp.gid, tp.code_pot, MAX(align) align, MAX(mhis) mhis
    FROM 
    	(SELECT TP.GID, TP.CODE_POT,'OUI' AS ALIGN, NULL AS MHIS
      FROM A_REIMS.TP_ARRET TP, A_REIMS.PO_RALAR AL
      WHERE SDO_WITHIN_DISTANCE (TP.GEOMETRY, AL.GEOMETRY, 'distance = 10') ='TRUE'
      UNION 
      SELECT TP.GID, TP.CODE_POT, NULL, 'OUI'
      FROM A_REIMS.TP_ARRET TP, PP_RMHIP HIS
      WHERE SDO_RELATE (TP.GEOMETRY, HIS.GEOMETRY, 'mask=inside') = 'TRUE'
      )
    GROUP BY tp.gid, tp.code_pot

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Ce qui fait qu'on verra si ça vient de l'un, l'autre, ou les deux (grâce aux null) .. Astucieux !

  6. #6
    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
    Résultats : la jointure c'était la meilleur idée, mais les performances ne sont pas bonnes.
    J'ai testé avec succès la suggestion de McM.
    Merci à vous tous.

Discussions similaires

  1. Requête union avec critères
    Par sheira dans le forum Requêtes
    Réponses: 8
    Dernier message: 10/06/2011, 12h01
  2. Critère sur requête union
    Par MelaAllIn dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 04/11/2009, 15h24
  3. Simplification d'une requête UNION
    Par eautret dans le forum Langage SQL
    Réponses: 6
    Dernier message: 18/01/2005, 14h51
  4. Tri d'une requête UNION
    Par MasterOfChakhaL dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/08/2004, 10h26
  5. Requête UNION sous Interbase 6 ...
    Par Djedjeridoo dans le forum InterBase
    Réponses: 2
    Dernier message: 27/07/2004, 09h08

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