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