如何决定何时使用右连接/左连接或内连接或如何确定哪一个表位于哪一侧?

38 mysql sql t-sql sql-server oracle

我知道连接的用法,但有时当我无法确定哪个连接适合左边或右边时,我会遇到这种情况.

这是我被困的查询.

    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
Run Code Online (Sandbox Code Playgroud)

Pra*_*ana 109

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

为什么要使用SQL JOIN?

答案:每当必须通过SQL SELECT语句访问多个表时,请使用SQL JOIN,如果JOINed表之间没有匹配项,则不应返回任何结果.

阅读有关代码项目的原始文章将对您有所帮助:SQL连接的可视化表示.

替代文字

另请查看这篇文章:SQL SERVER - 更好的性能 - LEFT JOIN还是NOT IN?.

找到原始的:MySQL中的JOIN和OUTER JOIN之间的区别.


Kni*_*ins 13

两套:

  • 如果需要两个集合的所有结果,请使用完全外部联接.

  • 如果只需要两个集合中显示的结果,请使用内部联接.

  • 如果希望所有结果都设置为a,则使用左外连接,但如果设置b具有与某些set a记录相关的数据,那么您也希望在同一查询中使用该数据.

请参考下图:

SQL连接


Aci*_*Zor 5

我认为你要找的是LEFT JOIN从主表开始,从主表中返回所有记录,无论它们在连接的表中是否有有效数据(如图中左上角2所示)

JOIN是连续发生的,所以如果你有4个表加入,并且你总是想要主表中的所有记录,你需要在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
Run Code Online (Sandbox Code Playgroud)

如果你INNER JOIN是sub_sub_table,它会立即缩小你的结果集,即使你在sub_table LEFT JOIN上做了一个.

请记住,在执行操作时LEFT JOIN,您需要考虑NULL返回的值.因为如果没有记录可以与main_table连接,则LEFT JOIN强制该字段出现,并且将包含NULL.INNER JOIN显然只是"扔掉"行而不是因为两者之间没有有效的链接(根据您加入的ID没有相应的记录)

但是,你提到你有一个where语句来过滤你正在寻找的行,所以你对JOIN的问题是无效的,因为这不是你真正的问题.(这是我理解你的评论的正确方法)

  • 我忘了添加,从表中开始想要获取数据FROM(主表可以是任何东西),然后是INNER JOIN或LEFT JOIN.这种方式不那么复杂,而不是跟踪RIGHT JOIN或OUTER JOIN语句 (3认同)