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 :

[Perfs] UNION vs Plusieurs requetes indépendantes


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut ORDER BY dans requête avec UNION
    Bonjour,

    J'essaie d'effectuer un order by dans ma requête, mais à chaque fois j'obtiens une erreur. Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT MONTANT FROM MEMBRE where ID = 46
    UNION
    SELECT MONTANT FROM MEMBRE where id = 12
    ORDER BY DATE_VALEUR
    Et voici l'erreur que j'obtiens :

    ORA-00904: "DATE_VALEUR": invalid identifier
    Petite précision inutile : le champs DATE_VALEUR existe bien dans ma table...
    J'ai également essayer de mettre des alias, mais rien n'y fais
    Ce n'est pas possible de définir un ordre lorsque l'on utilise UNION ou est-ce moi qui fais faux ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    ca marchera mieux comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT MONTANT, DATE_VALEUR  FROM MEMBRE WHERE ID = 46
    UNION
    SELECT MONTANT, DATE_VALEUR FROM MEMBRE WHERE ID = 12
    ORDER BY DATE_VALEUR
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Ok, super, merci beaucoup.

    Je profite pour savoir si l'utilisation d'alias est utile dans mon cas ? (Au niveau performance ou autre)
    En faisant par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT M1.MONTANT, M1.DATE_VALEUR  FROM MEMBRE M1 WHERE ID = 46
    UNION
    SELECT M2.MONTANT, M2.DATE_VALEUR FROM MEMBRE M2 WHERE ID = 12
    ORDER BY M1.DATE_VALEUR

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

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Le order by s'effectue après la sélection de l'UNION. M1.datevaleur est inconnu, datevaleur est connu.
    C'est comme si tu faisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select *
    from 
    (SELECT M1.MONTANT, M1.DATE_VALEUR  FROM MEMBRE M1 WHERE ID = 46
    UNION
    SELECT M2.MONTANT, M2.DATE_VALEUR FROM MEMBRE M2 WHERE ID = 12
    )
    ORDER BY M1.DATE_VALEUR
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT M1.MONTANT "MONTANT", M1.DATE_VALEUR "DATE_VALEUR" FROM MEMBRE M1 WHERE ID = 46
    UNION
    SELECT M2.MONTANT "MONTANT", M2.DATE_VALEUR "DATE_VALEUR" FROM MEMBRE M2 WHERE ID = 12
    ORDER BY DATE_VALEUR
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT M1.MONTANT, M1.DATE_VALEUR  FROM MEMBRE M1 WHERE ID = 46
    UNION
    SELECT M2.MONTANT, M2.DATE_VALEUR FROM MEMBRE M2 WHERE ID = 12
    ORDER BY 1
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Super, merci beaucoup pour vos explications

  7. #7
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut [Perfs] UNION vs Plusieurs requetes indépendantes
    Bonjour,

    J'aimerais savoir qu'est-ce qui est le mieux au niveau perfs entre une requete avec UNION du genre :

    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
     
    SELECT 	MONTANT, 1 
    FROM 	MA_TABLE 
    WHERE 	ID_M = 12 AND 
    	DOMAINE = 'ACHAT' AND
    	DATE_VALEUR = '09-feb-2008'
    UNION
    SELECT 	MONTANT, 2 
    FROM 	MA_TABLE 
    WHERE 	ID_M = 120 AND 
    	DOMAINE = 'ACHAT' AND
    	DATE_VALEUR = '12-feb-2008'
    UNION
    SELECT 	MONTANT, 3 
    FROM 	MA_TABLE 
    WHERE 	ID_M = 43 AND 
    	DOMAINE = 'ACHAT' AND
    	DATE_VALEUR = '15-feb-2008'
    ORDER BY 2
    Ou alors de faire 3 requêtes indépendantes (dans une seule transaction)

    Pour ma part je pencherais sur le UNION, mais je ne sais pas trop ....

    Merci d'avance

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    D'abord, le UNION fait un tri pour supprimer les doublons, est-ce bien ce que tu veux ? Ensuite, pourquoi ne pas faire une seule requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 	MONTANT, DECODE(ID_M,12,1,120,2,43,3)
    FROM 	MA_TABLE 
    WHERE 	(ID_M,DATE_VALEUR) IN ((12,'09-feb-2008'),(120,'12-feb-2008'),(43,'15-feb-2008'))
    AND  DOMAINE = 'ACHAT' 
    ORDER BY 2
    PS : j'ai fusionné tes 2 discussions qui traitent le même problème

  9. #9
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    PS : j'ai fusionné tes 2 discussions qui traitent le même problème
    Oui, j'ai pas vraiment fais gaffe....

    Alors non, je veux les doublons, j'ai regardé, il faut utiliser UNION ALL c'est ça ?

    Une seule requête irait très bien mais le problème est que j'ai simplifié la requête pour le post :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    SELECT 	MONTANT, 1 
    FROM 	CO_DWH_ANALYSE_FIN_DETAIL 
    WHERE 	DO_TDOCSYS_CI = 'CLO' AND 
    	DO_GENRE_DOC_ID = 46 AND
    	DOMAINE = 'ACHAT' AND
    	BASE_OU_ECHEANCE = 'BASE' AND
    	DB_ELEMENT_ID = 5 AND
    	DATE_VALEUR = '09-feb-2008'
    UNION
    SELECT 	MONTANT, 2 
    FROM 	CO_DWH_ANALYSE_FIN_DETAIL
    WHERE 	DO_TDOCSYS_CI = 'CLO' AND
    	DO_GENRE_DOC_ID = 46 AND
    	DOMAINE = 'ACHAT' AND
    	BASE_OU_ECHEANCE = 'BASE' AND
    	DB_ELEMENT_ID = 5 AND
    	ANNEE = '2008' AND
    	SEMAINE = '7'
    UNION
    SELECT 	MONTANT, 3
    FROM	CO_DWH_ANALYSE_FIN_DETAIL
    WHERE 	DO_TDOCSYS_CI = 'CLO' AND
    	DO_GENRE_DOC_ID = 46 AND
    	DOMAINE = 'ACHAT' AND
    	BASE_OU_ECHEANCE = 'BASE' AND
    	DB_ELEMENT_ID = 5 AND
    	ANNEE = '2008' AND
    	MOIS = '2'
    UNION
    SELECT 	MONTANT, 4
    FROM	CO_DWH_ANALYSE_FIN_DETAIL
    WHERE 	DO_TDOCSYS_CI = 'CLO' AND
    	DO_GENRE_DOC_ID = 46 AND
    	DOMAINE = 'ACHAT' AND
    	BASE_OU_ECHEANCE = 'BASE' AND
    	DB_ELEMENT_ID = 5 AND
    	ANNEE = '2008' AND
    	MOIS >= '1' AND MOIS <= '3'
    UNION
    SELECT 	MONTANT, 5
    FROM	CO_DWH_ANALYSE_FIN_DETAIL
    WHERE 	DO_TDOCSYS_CI = 'CLO' AND
    	DO_GENRE_DOC_ID = 46 AND
    	DOMAINE = 'ACHAT' AND
    	BASE_OU_ECHEANCE = 'BASE' AND
    	DB_ELEMENT_ID = 5 AND
    	ANNEE = '2008' AND
    	MOIS >= '1' AND MOIS <= '6'
    UNION
    SELECT 	MONTANT, 6
    FROM 	CO_DWH_ANALYSE_FIN_DETAIL
    WHERE 	DO_TDOCSYS_CI = 'CLO' AND
    	DO_GENRE_DOC_ID = 46 AND
    	DOMAINE = 'ACHAT' AND
    	BASE_OU_ECHEANCE = 'BASE' AND
    	DB_ELEMENT_ID = 5 AND
    	ANNEE = '2008'
    ORDER BY 2
    Comme tu peux le voir, certains critères de la clause where ne sont utilisés que dans certaines requête, donc je vois pas trop comment je pourrais en faire qu'une seule ...

    Encore merci pour ton aide

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    En effet, UNION ALL ce serait pas plus mal alors. Et pour répondre à ta question, il vaut mieux une seule requête pour laisser l'optimiser chercher les données au mieux en fonction de tout ce qui est ramené

  11. #11
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Super, merci beaucoup,

    Je vais donc utiliser UNION ALL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/11/2005, 14h06
  2. critère de période commun à plusieurs requete
    Par Nicko29 dans le forum Access
    Réponses: 4
    Dernier message: 26/09/2005, 20h46
  3. plusieur requete ds une procedure stocké
    Par subzero82 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/09/2005, 13h02
  4. Réponses: 5
    Dernier message: 23/06/2005, 10h18
  5. [OPTIMISATION] [UNION] Union dans une requete
    Par nico44 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/03/2005, 12h47

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