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

Requêtes et SQL. Discussion :

Requete SELECT SQL sans doublon


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Requete SELECT SQL sans doublon
    Bonjour,

    Je cherche depuis quelques jours et je n'arrive toujours pas à obtenir le résultat souhaité.

    J'ai 2 tables qui sont composées d'environs 50 000 lignes
    Table1(ID_t1,Ref)
    Table2(ID_t2,Ref)
    Les valeurs de ref peuvent être présentes et identiques plusieurs fois dans chaque table.
    Ref sert de liaison (inner join) entre les deux tables

    Je souhaite matcher ces 2 tables sous conditions :
    ID_t1 n'apparait qu'une seule fois dans la requête résultat.
    ID_t2 n'apparait qu'une seule fois dans le requête résultat.
    Ref peut apparaitre plusieurs fois dans

    exemple bon résultat
    Id_t1 Id_t2 ref
    50 60 A5000
    52 62 A5000
    53 65 A5600

    Mauvais résultat (ce que j'ai actuellement)
    Id_t1 Id_t2 ref
    50 60 A5000
    52 60 A5000
    50 62 A5000
    52 62 A5000
    53 65 A5600

    En vous remerciant par avance pour votre aide précieuse.

  2. #2
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour arnaud_76,

    Je comprend ta question mais sur quel critère te bases-tu pour dire que :
    Id_t1 Id_t2 ref
    50 60 A5000
    52 62 A5000
    53 65 A5600
    Est la bonne combinaison,
    alors pourquoi :
    Id_t1 Id_t2 ref
    50 62 A5000
    52 60 A5000
    53 65 A5600
    ne serait pas bon? On a encore une fois seulement 50 et 52 pour A5000, idem pour 60 et 62.

    Bonne journée

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Bonjour Robert1957,

    Les deux solutions sont bonnes (mon exemple et ton exemple).
    La contrainte, chaque id de la table 1 et 2 ne doivent apparaître qu'une seule fois dans les résultats.

    C'est pour une réconciliation de vente de billeterie avec des paiement cb. Je n'ai pas d'id uniques entre la table de reservation et de paiement. Juste la référence de la réservation. Mais un billet peut être modifié, par exemple deux modifications de 10 euros pour un billet initial de 30 euros.
    Donc 3 lignes dans chaque table (si les paiement en cb sont effectivement réceptionnés).
    Peut importe le choix des id pour les 2 paiements de 10 euros (mon exemple et ton exemple).

    Dans mon travail j'utilise pour la liaison :
    - référence de la resa (mon 1er post)
    - le montant
    - la date de la resa=la date du paiement
    Mais j'ai des doublons (le cas de l'exemple des 10 euros)

  4. #4
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour arnaud_76,

    Pas certain de bien comprendre. Je ne vois pas comment faire ce que tu veux avec une requête. Une fonction et une table temporaire pourrait le faire mais je crois que ça ne serait pas très performant.

    Est-ce que la combinaison suivante est bonne:
    Id_t1 Id_t2 ref
    50 62 A5000
    50 60 A5000
    53 65 A5600

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Re Robert1957,
    Non dans la table de résultat, colonne 1,
    50 est présent deux fois.
    Les id de la table 1 ne doivent être présents qu'une seule fois dans la table de résultat.
    Idem pour les id de la table 2

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Robert1957,
    La performance n'est pas la priorité pour l'instant.
    Je serai le seul à lancer la requete et une fois par mois.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Robert 1957,
    Au pire des cas, si il n'y a pas de solution uniquement en mode sql, je ferai
    une procédure vba pour éliminer les doublons.

  8. #8
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    Salut arnaud_76 et Robert1957,

    Pour ne pas reprendre un id, il faut l'énumérer et inclure cette énumération dans la jonction avec le ref.
    Mais le vrai problème se présente s'il n'y a pas le même nombre d'id_t1 et d'id_t2 pour une même ref.
    En prenant les id_t2 à partir d'id_t1 cela ne suffit pas il faut y inclure les id_t1 à partir d'id_t2 (une sorte de full outer join) pour ne pas omettre des enregistrements.
    si le cas ne se présente pas l'énumération dans la jonction suffira, sinon il faut une solution de ce genre :

    Code SQL : 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
     
    SELECT
       (SELECT First(id_t1) FROM Table1 as t3
          WHERE
          (SELECT count(id_t1) FROM Table1 as t4 WHERE (t3.id_t1>=t4.id_t1) and (t3.ref=t4.ref) ORDER BY count(id_t1))
         >=
          (SELECT count(id_t2) FROM Table2 as t1 WHERE (t2.id_t2>=t1.id_t2) and (t2.ref=t1.ref) ORDER BY count(id_t2))
          AND (t3.ref=t2.ref)
       ) as id1,
       id_t2 as id2,
       ref
    FROM Table2 as t2
    UNION
    SELECT
       id_t1 as id1,
       (SELECT First(id_t2) FROM Table2 as t3
          WHERE
          (SELECT count(id_t2) FROM Table2 as t4 WHERE (t3.id_t2>=t4.id_t2) and (t3.ref=t4.ref) ORDER BY count(id_t2))
         >=
          (SELECT count(id_t1) FROM Table1 as t1 WHERE (t2.id_t1>=t1.id_t1) and (t2.ref=t1.ref) ORDER BY count(id_t1))
          AND (t3.ref=t2.ref)
       ) as id2,
       ref
    FROM Table1 as t2


  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup Vodiem. Je teste ça dans la journée.

Discussions similaires

  1. requete select sql access
    Par nicolas_cs2i dans le forum Accès aux données
    Réponses: 11
    Dernier message: 27/04/2017, 10h45
  2. [AC-2000] Ma requete SELECT crée des doublons
    Par zabisou dans le forum Requêtes et SQL.
    Réponses: 31
    Dernier message: 29/09/2010, 13h37
  3. Requete affichage compétence sans doublon
    Par coyote90 dans le forum Requêtes
    Réponses: 7
    Dernier message: 19/11/2009, 11h43
  4. requete select sql
    Par swinia dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/05/2009, 16h16
  5. Affichage lignes SQL sans doublons
    Par Aquellito dans le forum ASP
    Réponses: 2
    Dernier message: 23/03/2009, 16h11

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