web-dev-qa-db-fra.com

Comment puis-je décider quand utiliser les jointures droites / gauches ou les jointures internes ou comment déterminer quelle table se trouve de quel côté?

Je connais l'utilisation des jointures, mais parfois je rencontre une telle situation lorsque je ne suis pas en mesure de décider quelle jointure conviendra, une gauche ou droite.

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

    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
35
user240141

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 accessibles via une instruction SQL SELECT et aucun résultat ne doit être renvoyé s'il n'y a pas de correspondance entre le JOINed les tables.

La lecture de cet article original sur The Code Project vous aidera beaucoup: Représentation visuelle des jointures SQL .

alt text

Consultez également cet article: SQL SERVER - Better Performance - LEFT JOIN or NOT IN? .

Trouvez l'original à: Différence entre JOIN et OUTER JOIN dans MySQL .

105
Pranay Rana

En deux sets:

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

  • Utilisez une jointure interne lorsque vous souhaitez uniquement les résultats qui apparaissent dans les deux ensembles.

  • Utilisez une jointure externe gauche lorsque vous souhaitez obtenir 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, vous devez également utiliser ces données dans la même requête.

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

SQL Joins

13

Je pense que ce que vous cherchez, c'est de faire un LEFT JOIN à partir de la table principale pour renvoyer tous les enregistrements de la table principale, même s'ils contiennent des données valides dans celles jointes (comme indiqué par les 2 cercles en haut à gauche du graphique)

JOIN se produit successivement, donc si vous avez 4 tables à joindre et que vous voulez toujours tous les enregistrements de votre table principale, vous devez continuer LEFT JOIN partout, 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 INNER JOIN le sub_sub_table, il réduira immédiatement votre résultat même si vous avez fait un LEFT JOIN sur la sous_table.

N'oubliez pas, lorsque vous faites LEFT JOIN, vous devez prendre en compte les valeurs de NULL renvoyées. Parce que si aucun enregistrement ne peut être joint à la table principale, un LEFT JOIN force ce champ à apparaître indépendamment et contiendra un NULL. INNER JOIN va évidemment simplement "jeter" la ligne à la place car il n'y a pas de lien valide entre les deux (pas d'enregistrement correspondant basé sur les identifiants que vous avez joints)

Cependant, vous mentionnez que vous avez une instruction where qui filtre les lignes que vous recherchez, donc votre question sur les JOIN est nulle et non avenue car ce n'est pas votre vrai problème. (C'est si je comprends bien vos commentaires)

5
AcidRaZor