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

Langage SQL Discussion :

Distinct sur une Union


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut Distinct sur une Union
    Bonjour,

    J'aimerai faire un distinct sur une union. Mais je ne trouve pas comment faire.

    Exemple

    select * from A
    union
    select * from B

    les tables A et B ont les meme champs. je veux faire un distinct sur un champ personne par exemple ( non clé primaire).

    Je veux donc que la requette me retourne les lignes de A et de B mais sans doublon de personne.

    Pouvez vous m'aider ?

    Merci d'avance

  2. #2
    Membre éclairé Avatar de Sekigawa
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 432
    Par défaut
    Je trouve ça assez confus??...

  3. #3
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut


    les tables A et B se ressembles beaucoup. je veux extraire uniquement les lignes qui ont le champ personne differents.

    le champ personne est dans les 2 tables.

  4. #4
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    quelqu'un a t'il une idée de comment le faire sans créer de vue?

    j'ai essayé de plusieurs facon mais je tourne en rond.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 133
    Par défaut
    Toutes les lignes de a, et celles de b qui n'ont pas l'identifiant personne dans a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        SELECT    *
        FROM    a
    UNION
        SELECT    *
        FROM    b
        WHERE    NOT EXISTS
                (    SELECT    1
                    FROM    a
                    WHERE    a.personne = b.personne
    )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut Merci
    Merci beaucoup.
    Cela va poser probleme dans le cas ou il y'a plusieurs personnes identitiques dans A.

    En fait il faudrait une seule personne differente apres l'union.

    en gros le but de ma requette final, c'est faire l'union des 2 tables ne recuperer qu'une personne differente a chaque fois (pas de doublon de personne) et dans le cas où il y' a plusieurs doublons , on choisirai celui qu'il faut garder par le numero num le plus grand.


    Exemple

    table A
    personne num
    12 2
    12 6

    table B
    personne num
    12 3
    12 4
    13 7

    on devrais avoir comme résultat :

    personne num
    12 6
    13 7

    Merci d'avance

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    L'opérateur UNION fait implicitement un DISTINCT sur les tuples qu'il renvoie.

    Donc je pense que vous vous trompez déjà sur la notion de DISTINCT

  8. #8
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Citation Envoyé par vmolines Voir le message
    L'opérateur UNION fait implicitement un DISTINCT sur les tuples qu'il renvoie.

    Donc je pense que vous vous trompez déjà sur la notion de DISTINCT
    Bonjour,

    l'union si je ne me trompe pas fait le distinct sur toute les colonnes que l'on garde. Laors que moi je veux un distinct seulement sur la colonne personne en gardant les autre colonnes. une union sur mon exemple precedent retournerait toutes les lignes car les couples personne num sont uniques dans mon exemple

  9. #9
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut
    Citation Envoyé par vmolines Voir le message
    L'opérateur UNION fait implicitement un DISTINCT sur les tuples qu'il renvoie.

    Donc je pense que vous vous trompez déjà sur la notion de DISTINCT
    J'allais le dire ...

    Union fait deja le distinct donc, si tu as des id en double c'est qu'il ne correspondent pas à la même personne.

    Au pire tu peux ne ramener que les champs ID dans ton union et ca t'évitera d'avoir des lignes doublées (et apres tu repars chercher le reste de champs sur les ID donnés)



    Pour info, le UNION sans dédoublonnage se fait en utilisant "UNION ALL"

  10. #10
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Je sais pas si t'as vu le post que j'ai posté juste avant le tien en réponse à celui de vmolines.

    tous les couples personnes dans mon exemple sont uniques. dans ce cas la l'union me retournerait toutes les lignes, alors que moi je veux uniquement un distinct sur les personnes.

    si je ne recupere que les personnes, je serai incapable de faire ce que j'ai enoncé plus haut :

    en gros le but de ma requette final, c'est faire l'union des 2 tables ne recuperer qu'une personne differente a chaque fois (pas de doublon de personne) et dans le cas où il y' a plusieurs doublons , on choisirai celui qu'il faut garder par le numero num le plus grand.

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    Citation Envoyé par etounsi Voir le message
    Bonjour,

    l'union si je ne me trompe pas fait le distinct sur toute les colonnes que l'on garde. Laors que moi je veux un distinct seulement sur la colonne personne en gardant les autre colonnes. une union sur mon exemple precedent retournerait toutes les lignes car les couples personne num sont uniques dans mon exemple
    Arrêtez de parler de distinct sur un ensemble restreint de colonnes d'un tuple. CA N'EXISTE PAS. Ca ne conduit qu'à mal vous faire comprendre. Un distinct élimine les lignes qui ont les mêmes données et ce dans TOUTES LES COLONNES.

    Et dans la plupart des cas, quand on voit des personnes qui veulent résoudre un problème de requête par un distinct, cela vient d'une mauvaise définition de sa requête au départ. Dans toutes les requêtes j'ai pu faire, je dois avoir 0.01% de DISTINCT et je sais parfaitement dire pourquoi. D'ailleurs ces requêtes à base de DISTINCT auxquelles je pense, pourraient être réécrites sans et n'en serait que plus justes.

    Ceci étant dit, votre requête doit s'écrire avec un GROUP BY et un MAX puisque vous dîtes vous même qu'en cas de valeurs identiques sur une colonne (ou plusieurs) vous voulez le plus grand numéro.

    Je n'ai pas analysé votre problème en détail mais je suis presque sûr que cette piste est la solution.

  12. #12
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut
    Citation Envoyé par vmolines Voir le message
    Arrêtez de parler de distinct sur un ensemble restreint de colonnes d'un tuple. CA N'EXISTE PAS. Ca ne conduit qu'à mal vous faire comprendre. Un distinct élimine les lignes qui ont les mêmes données et ce dans TOUTES LES COLONNES.
    Je precise cela dit :
    dans toutes les colonnes RAMENEES.

  13. #13
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Citation Envoyé par miloux32 Voir le message
    Je precise cela dit :
    dans toutes les colonnes RAMENEES.
    merci
    Et donc si je devais satisfaire cet exemple:
    Exemple

    table A
    personne num
    12 2
    12 6

    table B
    personne num
    12 3
    12 4
    13 7

    on devrais avoir comme résultat :

    personne num
    12 6
    13 7
    A quoi ressemblerait la requette ?

  14. #14
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    je viens d'essayer ceci pour verifier la propriété

    select id, personne from A
    union
    select id, personne from B

    resultat:

    id personne
    56 12
    57 12


    le resultat comprend bien des personnes identiques.

    l'union verifie que le couple id personne soit unique, non ?

  15. #15
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    J'ai donné la réponse à votre problème.

  16. #16
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut
    Citation Envoyé par etounsi Voir le message
    merci
    Et donc si je devais satisfaire cet exemple:

    A quoi ressemblerait la requette ?
    Pour ca tu es obligé de fraire un group by !


    tes champs num sont distincts donc il va tous te les ramener.

    Le distinct permet de virer les doublons de ligne résultats .

    Pour avoir ton résultat tu dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select personne, max(num) from 
    (Select personne, num from TABLEA
    union all
     Select personne, num from TABLE B)
    group by personne
    Le union all evite de dédoublonner inutilement tes résultats, a voir cependant si tu as beaucoup de doublons entre tes tables

  17. #17
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut Merci
    Merci beaucoup.

    en fait la j'ai bien ce qu'il me faut je pense, sauf que le group by m'empeche de réccuperer les autres colonnes, comme l'id, l'adresse ...

  18. #18
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut
    Citation Envoyé par etounsi Voir le message
    Merci beaucoup.

    en fait la j'ai bien ce qu'il me faut je pense, sauf que le group by m'empeche de réccuperer les autres colonnes, comme l'id, l'adresse ...
    Rien ne t'empeche de faire de cette requete une sous requete ...

  19. #19
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Citation Envoyé par vmolines Voir le message
    J'ai donné la réponse à votre problème.
    Merci, je n'avais pas vu desolé.
    Il ne me reste plus qu'à réccuperé les autres collones. Le group by m'en empeche

  20. #20
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Citation Envoyé par miloux32 Voir le message
    Rien ne t'empeche de faire de cette requete une sous requete ...
    oui j'ai essayé, mais si je reccupere les personnes avec la sous requette, et que ej met une requette par dessus je vais faire réapparaitre les doublons en erfaisant une union non ?

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/04/2007, 17h32
  2. distinct sur une partie de ligne
    Par igorzup dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/03/2007, 00h08
  3. Distinct sur une requete
    Par Sancho_54 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/03/2007, 00h19
  4. Réponses: 2
    Dernier message: 07/10/2006, 19h46
  5. [Débutant] DISTINCT sur une seule des colonnes ?
    Par Neilos dans le forum Langage SQL
    Réponses: 9
    Dernier message: 23/06/2004, 23h04

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