我如何决定何时使用正确的连接/左连接或内部连接或如何确定哪个表在哪一边?

我知道连接的用法,但是当我无法决定哪一个连接是合适的, 左边或右边的时候,我有时遇到这样的情况。

这里是我被卡住的查询。

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 

是的,这取决于你所处的情况。

为什么使用SQL JOIN?

答案 :无论何时必须通过SQL SELECT语句访问多个表,都使用SQL JOIN,如果JOIN表之间没有匹配,则不应返回任何结果。

阅读这篇关于代码项目的原始文章将会帮助你很多: SQL连接的可视化表示 。

替代文字

另外检查这个职位: SQL服务器 – 更好的性能 – 左join或不在? 。

查找原始的一个: 在MySQL的JOIN和OUTER JOIN之间的区别 。

我想你要找的是从主表开始执行LEFT JOIN以返回主表中的所有logging,而不pipe它们是否具有有效数据(如图中左上angular的2个圆圈所示) )

JOIN是连续发生的,所以如果你有4个表join,并且你总是需要你主表中的所有logging,那么你需要在整个过程中继续LEFT JOIN ,例如:

 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 

如果你INNER JOIN sub_sub_table,它会立即缩小你的结果,即使你在子表上执行了LEFT JOIN

请记住,在进行LEFT JOIN ,您需要考虑返回的NULL值。 因为如果没有logging可以与main_table连接,则LEFT JOIN强制该字段不pipe是否出现,并且将包含NULL。 INNER JOIN显然只是“扔掉”这一行,因为这两者之间没有有效的联系(根据你join的ID没有相应的logging)

不过,你提到你有一个where语句来过滤掉你正在查找的行,所以你对JOIN的问题是无效的,因为这不是你真正的问题。 (这是如果我正确理解你的意见)

两套:

  • 当你想要两个集合的所有结果时,使用完整的外连接。

  • 当只需要在两个集合中出现的结果时,使用内连接。

  • 当你想要设置所有的结果时,使用左外部联接,但是如果set b具有与某些设置logging相关的数据,那么你也想在同一个查询中使用这些数据。

请参考以下图片:

SQL联接