50 votes

Comment décider quand utiliser les jointures externes droites/gauches ou les jointures internes ? Ou comment déterminer quelle table se trouve de chaque côté ?

Je connais l'utilisation des jointures, mais parfois je me retrouve dans une situation où je ne suis pas capable de décider quelle jointure sera appropriée, une gauche ou droite.

Voici la requête où je suis bloqué.

    SELECT  count(ImageId) as [IndividualRemaining],
                userMaster.empName AS ID#,
                CONVERT(DATETIME, folderDetails.folderName, 101) AS FolderDate,
                batchDetails.batchName AS Batch#,
                Client=@ClientName,
                TotalInloaded = IsNull(@TotalInloaded,0),
                PendingUnassigned = @PendingUnassigned,
                InloadedAssigned =     IsNull(@TotalAssigned,0),
                TotalProcessed = @TotalProcessed,
                Remaining = @Remaining
        FROM
                batchDetails
                    Left JOIN  folderDetails ON batchDetails.folderId = folderDetails.folderId
                    Left JOIN  imageDetails ON batchDetails.batchId = imageDetails.batchId
                    Left JOIN  userMaster ON imageDetails.assignedToUser = userMaster.userId

        WHERE   folderDetails.ClientId =@ClientID and verifyflag='n'
                and folderDetails.FolderName IN (SELECT convert(VARCHAR,Value) FROM dbo.Split(@Output,','))
                and userMaster.empName <> 'unused'

        GROUP BY userMaster.empName, folderDetails.folderName, batchDetails.batchName

        Order BY folderDetails.Foldername asc

132voto

Pranay Rana Points 69934

Oui, cela dépend de la situation dans laquelle vous vous trouvez.

Pourquoi utiliser SQL JOIN?

Réponse: Utilisez le SQL JOIN chaque fois que plusieurs tables doivent être accédées via une instruction SQL SELECT et aucun résultat ne doit être renvoyé s'il n'y a pas de correspondance entre les tables JOIN.

Lire cet article original sur The Code Project vous aidera beaucoup: Visual Representation of SQL Joins.

texte alternatif

Vérifiez également ce post: SQL SERVER – Meilleures performances – LEFT JOIN ou NOT IN?.

Trouvez l'original sur: Différence entre JOIN et OUTER JOIN en MySQL.

16voto

Dans deux ensembles:

  • Utilisez une jointure externe complète lorsque vous voulez tous les résultats des deux ensembles.

  • Utilisez une jointure interne lorsque vous ne voulez que les résultats qui apparaissent dans les deux ensembles.

  • Utilisez une jointure externe gauche lorsque vous voulez tous les résultats de l'ensemble A, mais si l'ensemble B contient des données pertinentes pour certains enregistrements de l'ensemble A, alors vous voulez également utiliser ces données dans la même requête.

Veuillez vous référer à l'image suivante:

SQL Joins

7voto

AcidRaZor Points 473

Je pense que ce que vous recherchez est de faire un LEFT JOIN à partir de la table principale pour renvoyer tous les enregistrements de la table principale, indépendamment de la validité des données dans les tables jointes (comme indiqué par les 2 cercles en haut à gauche dans le graphique)

Les JOINS se font successivement, donc si vous avez 4 tables à joindre et que vous voulez toujours tous les enregistrements de votre table principale, vous devez continuer à utiliser LEFT JOIN tout au long, par exemple :

SELECT * FROM main_table
LEFT JOIN sub_table ON main_table.ID = sub_table.main_table_ID
LEFT JOIN sub_sub_table ON main_table.ID = sub_sub_table.main_table_ID

Si vous faites un INNER JOIN avec la sub_sub_table, cela réduira immédiatement votre ensemble de résultats même si vous avez fait un LEFT JOIN avec la sub_table.

N'oubliez pas que lorsque vous faites un LEFT JOIN, vous devez tenir compte des valeurs NULL renvoyées. Parce que si aucun enregistrement ne peut être joint à la table principale, un LEFT JOIN force ce champ à apparaître quand même et contiendra un NULL. INNER JOIN jettera évidemment simplement la ligne car il n'y a pas de lien valide entre les deux (pas d'enregistrement correspondant basé sur les ID que vous avez joints)

Cependant, vous mentionnez avoir une clause WHERE qui filtre les lignes que vous recherchez, donc vos questions sur les JOIN sont nulles et non avenues car ce n'est pas votre vrai problème. (Cela si je comprends correctement vos commentaires)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X