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

Développement SQL Server Discussion :

Compréhension de UNION [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut Compréhension de UNION
    Bonjour,

    En faisant un test, je me trouve devant un problème sur UNION que j'ai du mal à comprendre.
    Pour moi, UNION ajoutait 2 ou n résultats de requêtes.
    Hors, si je code comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    WITH Cte(N)
         AS (SELECT TOP 10 numero
             FROM   comclient
             WHERE  cloture_auto = 1),
         Cte2 (N)
         AS (SELECT *
             FROM   Cte)
    SELECT *
    FROM   Cte2
    UNION
    SELECT *
    FROM   Cte2
    J'obtiens un résultat de 10 lignes. Est-ce que ça ne devrait pas être 20 ? (Je sais, la requête n'a aucun sens, c'est juste pour l'exemple).

    Ensuite, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    SELECT *
    FROM   Cte
    UNION
    SELECT *
    FROM   Cte2
    Résultat: 11 lignes

    Et pire ... si je l'exécute plusieurs fois de suite, je n'obtiens pas le même nombre de lignes à chaque fois . Ça va de 10 à 16 en passant par 11, 12, 14.

    Et là, je comprends plus du tout

    Il y a une logique sous-jacente que je n'ai pas vue ?

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    J'obtiens un résultat de 10 lignes. Est-ce que ça ne devrait pas être 20 ?
    Non, UNION dédoublonne. Le résultat revient à faire un distinct, ce qui fait que vous n'avez que vos dix lignes d'origine.

    Pour éviter cela, il faudrait faire une UNION ALL.


    Citation Envoyé par Papy214
    Et là, je comprends plus du tout
    Et là... moi non plus !
    Un début d'explication malgré tout qui reste à vérifier :

    Vous faites un TOP(10) sans clause de tri. Le résultat n'est pas déterministe, et chaque SELECT ne renvoi donc pas forcément les mêmes lignes, ce qui pourrait expliquer ce comportement.

  3. #3
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Alors là je dis : "Monsieur ...."

    Y'a rien à jeter dans les réponses ...

    Par contre, je viens d'apprendre que UNION dédoublonne :-(
    Et ça, ça va m'obliger à vérifier certaines requêtes déjà écrites.

    Un grand merci ....

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Pour ne pas dédoublonner, il suffit d'utiliser "UNION ALL"
    D'ailleurs, "UNION ALL" est plus rapide, puisque... il ne fait pas le distinct (du coup).
    Personnellement, j'utilise systématiquement "ALL", sauf si je détermine que j'ai effectivement un réel besoin d'un DISTINCT.

  5. #5
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Maintenant, je le saurai :-)

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

Discussions similaires

  1. onclipevent (problème de compréhension)
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 24/09/2003, 15h09
  2. UNION et COUNT(*)
    Par Goldust dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/08/2003, 09h30
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07
  5. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22

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