我如何决定何时使用正确的连接/左连接或内部连接或如何确定哪个表在哪一边?
我知道连接的用法,但是当我无法决定哪一个连接是合适的, 左边或右边的时候,我有时遇到这样的情况。
这里是我被卡住的查询。
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相关的数据,那么你也想在同一个查询中使用这些数据。
请参考以下图片: