Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1074 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Jointure SQL petite question

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Jointure SQL petite question

n°2022232
aspirateur
Posté le 10-09-2010 à 08:59:59  profilanswer
 

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

mood
Publicité
Posté le 10-09-2010 à 08:59:59  profilanswer
 

n°2022235
esox_ch
Posté le 10-09-2010 à 09:13:42  profilanswer
 

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
n°2022236
jeff@be
Posté le 10-09-2010 à 09:16:09  profilanswer
 

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

n°2022251
aspirateur
Posté le 10-09-2010 à 10:18:43  profilanswer
 

Merci beaucoup, ca fonctionne a merveille

n°2022255
Oliiii
Posté le 10-09-2010 à 10:39:03  profilanswer
 

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).

n°2022261
aspirateur
Posté le 10-09-2010 à 10:57:56  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Jointure SQL petite question

 

Sujets relatifs
Question existentielle : free()Convertir XLS en SQL
[SQL Server 2005] Exporter une table vers un fichier texte via SSISquestion sur auto_ptr
[SQL SERVEUR] Backup complet serveur[SQL]-Tables Systèmes
[SQLSERVER]split et jointure ?[SQL] Une requete bien compliquée
[RESOLU] Requête SQL avec traitement d'un champ date[SQL Server] Job et espace dans le nom de la BDD
Plus de sujets relatifs à : Jointure SQL petite question


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR