SQL - dédoublonnage

SQL - dédoublonnage - SQL/NoSQL - Programmation

Marsh Posté le 30-09-2005 à 14:18:07    

Salut à tous,
 
Ci joint un code qui permet de sortir tous les champs de deux tables, qui ont la valeur email égales (code de access, d'où le sql un peu douteux)
 
SELECT [E-mail_clubistes].[E-mail], [E-mail_clubistes].[Code postal]  
FROM [E-mail_clubistes] INNER JOIN [Jeux magny cours] ON [E-mail_clubistes].[E-mail] = [Jeux magny cours].[E-mail];
 
Ca marche nickel mais voici ma question : peut on le faire sur 3 ou 4 tables en même temps ? Et si oui, comment ?
 
Merci bcp

Reply

Marsh Posté le 30-09-2005 à 14:18:07   

Reply

Marsh Posté le 30-09-2005 à 14:50:27    

Beh oui : JOIN ... ON ... JOIN ... ON .. JOIN ... ON ...
 
Enfin, selon le DBMS.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 06-10-2005 à 17:15:20    

Reply

Marsh Posté le 07-10-2005 à 00:42:26    

perso, je préfère la syntaxe qui passe partout et que je trouve plus lisible :
 
select ...
from table1, table2, ..., tablen
where table1.fk = table2.pk
and table2.fk = tableX.pk
...
and tableY.fk = tablen.pk

Reply

Marsh Posté le 18-10-2005 à 14:31:08    

Salut,
Merci bcp pour ces conseils. Par contre, cette requette me sort les enregistrements communs à toutes les tables. Or je souhaiterai les enregistrements inverses : les valeurs qui ne sont pas communes aux tables.  
Please help me ;-)

Reply

Marsh Posté le 18-10-2005 à 16:02:27    

voici :  
 
select *
from table1
where table1.col1 NOT IN (select col1 FROM table2)
 
etc etc si tu veux le faire sur plusieurs tables...

Reply

Marsh Posté le 18-10-2005 à 16:13:13    

fait des left join et une série de OR portant sur chaque élément des jointures avec "is null"
 
genre, dans ton exemple du dessus :
 
([E-mail_clubistes].[E-mail] is null or [Jeux magny cours].[E-mail] is null)

Reply

Marsh Posté le 18-10-2005 à 17:54:29    

yes, ca marche, sauf que je n'ai que les enregistrements de la première table et qui ne sont pas dans la deuxième. Il me manque les enregistrements de la seconde table qui ne sont pas dans la première.
T'as une idée ?

Reply

Marsh Posté le 18-10-2005 à 19:27:26    

ok, alors essaie ça :
 

Code :
  1. SELECT [E-mail_clubistes].[E-mail], [E-mail_clubistes].[Code postal] 
  2. FROM [E-mail_clubistes] LEFT JOIN [Jeux magny cours] ON [E-mail_clubistes].[E-mail] = [Jeux magny cours].[E-mail]
  3. where [Jeux magny cours].[E-mail] is null
  4. union
  5. SELECT [E-mail_clubistes].[E-mail], [E-mail_clubistes].[Code postal] 
  6. FROM [E-mail_clubistes] RIGHT OUTER JOIN [Jeux magny cours] ON [E-mail_clubistes].[E-mail] = [Jeux magny cours].[E-mail]
  7. where [E-mail_clubistes].[E-mail] is null;


 
=> Si le "RIGHT OUTER JOIN" marche pas, interverti les deux tables et utilise "LEFT JOIN".
 
Si MySQL supporte le FULL JOIN ou FULL OUTER JOIN (PostGre le supporte, mais c'est plutôt rare) alors tu peux aussi faire :
 

Code :
  1. SELECT [E-mail_clubistes].[E-mail], [E-mail_clubistes].[Code postal] 
  2. FROM [E-mail_clubistes] FULL OUTER JOIN [Jeux magny cours] ON [E-mail_clubistes].[E-mail] = [Jeux magny cours].[E-mail]
  3. where [E-mail_clubistes].[E-mail] is null or [Jeux magny cours].[E-mail] is null;


 
L'intérêt d'un FULL OUTER JOIN, c'est que si t'as 25 tables, tu fais tes 25 jointures et t'as pas besoin de faire 25 union :D
 
Sinon, si c'est une version de MySQL récente, tu peux aussi faire :
 

Code :
  1. SELECT *
  2. FROM [E-mail_clubistes] a, [Jeux magny cours] b
  3. WHERE NOT EXISTS (select null from [E-mail_clubistes] c where b.[E-mail] = c.[E-mail]) and NOT EXISTS (select null from [Jeux magny cours] d where a.[E-mail] = d.[E-mail])

Reply

Marsh Posté le 18-10-2005 à 19:28:02    

Comme tu peux voir, y'a toujours 25 solutions pour arriver au bon résultat, ensuite reste à savoir quelle solution offre le meilleur compromis support/rapidité :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed