Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre du Club
    Inscrit en
    janvier 2012
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : janvier 2012
    Messages : 233
    Points : 57
    Points
    57

    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 Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 817
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 817
    Points : 23 074
    Points
    23 074

    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 :
    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 :
    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 de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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 du Club
    Inscrit en
    janvier 2012
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : janvier 2012
    Messages : 233
    Points : 57
    Points
    57

    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 chevronné
    Profil pro François
    Inscrit en
    février 2010
    Messages
    411
    Détails du profil
    Informations personnelles :
    Nom : François

    Informations forums :
    Inscription : février 2010
    Messages : 411
    Points : 667
    Points
    667

    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
    Inscrit en
    janvier 2010
    Messages
    2 985
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 2 985
    Points : 4 992
    Points
    4 992

    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 :
    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •