Précédent   Forum du club des développeurs et IT Pro > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 13/02/2013, 23h30   #1
bilou_12
Membre du Club
 
Inscription : janvier 2012
Messages : 233
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 233
Points : 63
Points : 63
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é!
bilou_12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 09h12   #2
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 671
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 671
Points : 25 524
Points : 25 524
Envoyer un message via MSN à CinePhil
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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 20h39   #3
bilou_12
Membre du Club
 
Inscription : janvier 2012
Messages : 233
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 233
Points : 63
Points : 63
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!
bilou_12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2013, 21h55   #4
Rams7s
Membre chevronné
 
François
Inscription : février 2010
Messages : 395
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 395
Points : 720
Points : 720
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.
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2013, 10h01   #5
aieeeuuuuu
Expert Confirmé
 
Inscription : janvier 2010
Messages : 1 805
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 805
Points : 2 885
Points : 2 885
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h21.


 
 
 
 
Partenaires

Hébergement Web