Jointure SQL petite question

Jointure SQL petite question - SQL/NoSQL - Programmation

Marsh Posté le 10-09-2010 à 08:59:59    

Bonjour,
 
J'ai besoin d'un petit coup de mains pour une jointure sql.
 
J'ai 2 tables:
 
table1(id, nom)
 
table2(id, id_table1, champ)
 
J'ai besoin d'afficher les infos de la table 1 dont l'id n'est pas dans la table 2.
 
Voici la requete que j'utilise (et qui fonctionne) r.
 
SELECT * FROM table1, table2   WHERE table1.id != table2.id_table1
 
mais elle est super longue a exécuter car il y a pas mal de données.
 
Je ne connais que les bases de sql mais je sais qu'il existe les jointures qui permettent d'optimiser ce genre de requête: Outer join.
 
Pouvez-vous m'expliquer comment ca marche dans mon cas ?
 
Merci

Reply

Marsh Posté le 10-09-2010 à 08:59:59   

Reply

Marsh Posté le 10-09-2010 à 09:13:42    

Déjà, tu as quoi comme indexes?
Tu as utilisé une FK sur le champ id_table1?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 10-09-2010 à 09:16:09    

Code :
  1. SELECT
  2.   table1.id,
  3.   table1.nom
  4. FROM
  5.   table1 LEFT JOIN
  6.   table2 ON table2.id_table1 = table1.id
  7. WHERE
  8.   table2.id IS NULL

Reply

Marsh Posté le 10-09-2010 à 10:18:43    

Merci beaucoup, ca fonctionne a merveille

Reply

Marsh Posté le 10-09-2010 à 10:39:03    

Juste une observation:

Code :
  1. SELECT * FROM table1, table2   WHERE table1.id != table2.id_table1


Ne te retournera pas les infos de table1 qui n'ont pas d'ID dans table2.
Ca va te retourner le produit cartésien des 2 tables sans les enregistrement ou table1.id = table2.id_table1.
Donc pour chaque ligne de table1 il va te retourner toute la table2 - les lignes ou table1.id = table2.id_table1.
 
Si tu veux essayer par toi meme et voir la difference:

Code :
  1. CREATE TABLE #table1 (id int, nom varchar(50))
  2. CREATE TABLE #table2 (id int, id_table1 int, champ varchar(50))
  3.  
  4. INSERT #table1 (id, nom) Values (1, 'nom1'),
  5.                                 (2, 'nom2'),
  6.                                 (3, 'nom3'),
  7.                                 (4, 'nom4'),
  8.                                 (5, 'nom5'),
  9.                                 (6, 'nom6'),
  10.                                 (7, 'nom7')
  11. TRUNCATE TABLE #table2
  12. INSERT #table2 (id, id_table1, champ) Values (1, 1, 'champ1'),
  13.                                              (2, 1, 'champ2'),
  14.                                              (3, 2, 'champ3'),
  15.                                              (4, 3, 'champ4'),
  16.                                              (5, 3, 'champ5'),
  17.                                              (6, 3, 'champ6'),
  18.                                              (7, 5, 'champ7'),
  19.                                              (8, 5, 'champ8'),
  20.                                              (9, 5, 'champ9'),
  21.                                              (10, 7, 'champ10'),
  22.                                              (11, 7, 'champ11'),
  23.                                              (12, 7, 'champ12'),
  24.                                              (13, 7, 'champ13'),
  25.                                              (14, 7, 'champ14')
  26.                                             
  27. SELECT * FROM #table1
  28. SELECT * FROM #table2
  29.  
  30. SELECT *
  31. FROM #table1 a
  32.     JOIN #table2 b on b.id_table1 = a.id
  33.     
  34. SELECT * FROM #table1, #table2 Where #table1.id != #table2.id_table1
  35.  
  36. SELECT *
  37. FROM #table1 a
  38.     LEFT JOIN #table2 b on b.id_table1 = a.id
  39. WHERE b.id IS NULL


 

Code :
  1. SELECT *
  2. FROM #table1 a
  3.     JOIN #table2 b on b.id_table1 = a.id

retourne 14 lignes.

Code :
  1. SELECT *
  2. FROM #table1 a
  3.     LEFT JOIN #table2 b on b.id_table1 = a.id
  4. WHERE b.id IS NULL

retourne 2 lignes (table1.id 4 et 6).
 

Code :
  1. SELECT * FROM #table1, #table2 Where #table1.id != #table2.id_table1

retourne 84 lignes ((7 de table1 * 14 de table2) - 14 de table1.id = table2.id_table1).

Reply

Marsh Posté le 10-09-2010 à 10:57:56    

Ah oui, tu as raison, je sais pas pourquoi je croyais que ca fonctionnait. Je viens de refaire le test et en effet ca affiche plein de fois la meme ligne.

Reply

Sujets relatifs:

Leave a Replay

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