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 :

Comparer deux bases et sélectionner les élements présents dans une seule des deux bases


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 233
    Points : 92
    Points
    92
    Par défaut Comparer deux bases et sélectionner les élements présents dans une seule des deux bases
    Bonjour,

    Voilà je possède 2 tables tabA et tabB ayant la même structure :
    tabA possède les champs :
    champ1
    champ2
    champ3

    tabB possède les champs :
    champ1
    champ2
    champ4

    Je voudrais pouvoir comparer les données présentes dans les tables afin de savoir si elles contiennent exactement la même chose et afficher les erreurs. Dans mon exemple, je souhaiterais afficher champ3 et champ4 non communs aux 2 bases. Connaissez-vous la fonction à utiliser? J'ai testé INTERSECT mais cela fait l'inverse...


    Merci pour votre aide et le temps consacré!

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Les champs sont à la campagne ou dans les formulaires, pas dans les tables SQL qui ne sont composées que de colonnes et de lignes.

    Si ton SGBD connaît FULL OUTER JOIN (donc pas le mauvais MySQL), tu peux faire cette requête pour trouver les lignes des deux tables qui n'ont pas de correspondance dans l'autre table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.col1, a.col2, a.col3,
    	b.col1, b.col2, b.col4
    FROM a
    FULL OUTER JOIN b
    	ON b.col1 = a.col1
    	AND b.col2 = a.col2
    WHERE a.col3 IS NULL
    	OR b.col4 IS NULL
    S'il s'agit de trouver les lignes des deux tables ayant une valeur différente dans col3 et col4 pour une même paire {col1, col2}, il suffit d'une jointure interne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT a.col1, a.col2, a.col3, b.col4
    FROM a
    INNER JOIN b
    	ON b.col1 = a.col1
    	AND b.col2 = a.col2
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 233
    Points : 92
    Points
    92
    Par défaut
    Merci CinePhil pour ta réponse! Malheureusement, je me suis mal exprimé et je suis pas sûr que cela corresponde (ou alors j'ai mal compris le full outer join après avoir lu un article dessus )

    Maintenant, j'ai 2 tables, chacune a 3 colonnes et 50 lignes. La 1ère colonne donne le nom du produit, la 2ème son prix et la 3ème son magasin.

    Comment puis-je faire pour afficher les lignes qui ne sont pas présentes et identiques dans les 2 tables? (afficher les produits présents que dans une des 2 tables et afficher les produits présents dans les 2 tables mais avec des prix ou des magasins différents?)

    Merci encore!

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Points : 807
    Points
    807
    Par défaut
    Pas de chance avec INTERSECT, fallait lire complétement la liste des autres opérateurs ensembliste.

    Il y avait aussi MINUS et UNION. C'est ça qu'il vous faut.

  5. #5
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par bilou_12 Voir le message
    Merci CinePhil pour ta réponse! Malheureusement, je me suis mal exprimé et je suis pas sûr que cela corresponde (ou alors j'ai mal compris le full outer join après avoir lu un article dessus )

    Maintenant, j'ai 2 tables, chacune a 3 colonnes et 50 lignes. La 1ère colonne donne le nom du produit, la 2ème son prix et la 3ème son magasin.

    Comment puis-je faire pour afficher les lignes qui ne sont pas présentes et identiques dans les 2 tables? (afficher les produits présents que dans une des 2 tables et afficher les produits présents dans les 2 tables mais avec des prix ou des magasins différents?)

    Merci encore!
    Il me semble que la solution de Cinephil avec le full outer join est correcte sur le principe, et qu'il suffit d'adapter la condition de jointure et le filtre au besoin précis, si j'ai a peu près compris, quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT a.col1, a.col2, a.col3,
    	b.col1, b.col2, b.col4
    FROM a
    FULL OUTER JOIN b
    	ON b.col1 = a.col1
    WHERE a.col3 IS NULL
    	OR b.col4 IS NULL
    	OR b.col2 <> a.col2
            OR b.col3 <> a.col3

Discussions similaires

  1. Réponses: 8
    Dernier message: 16/06/2014, 16h12
  2. Lister les composants présent dans une form
    Par QAYS dans le forum VB.NET
    Réponses: 1
    Dernier message: 23/02/2011, 12h09
  3. Réponses: 1
    Dernier message: 31/08/2010, 19h42
  4. [AC-2003] Exclure les enregistrements présent dans une autre table
    Par ajor dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 07/06/2009, 22h01
  5. retirer les enregistrements présents dans une autre table
    Par Didine1801 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/10/2007, 16h07

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