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

时间:2010-07-22 11:05:38

标签: mysql sql sql-server oracle tsql

我知道联接的用法,但有时候当我无法确定哪个加入是合适的,左或右时,我会遇到这种情况。

这是我被困的查询。

    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

3 个答案:

答案 0 :(得分:101)

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

为什么要使用SQL JOIN?

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

The Code Project上阅读这篇原创文章会对您有所帮助:Visual Representation of SQL Joins

alt text

同时查看此帖子:SQL SERVER – Better Performance – LEFT JOIN or NOT IN?

Difference between JOIN and OUTER JOIN in MySQL找到原始的。

答案 1 :(得分:11)

两套:

  • 如果需要两组中的所有结果,请使用完全外部联接。

  • 如果只想显示两者中的结果,请使用内部联接 集。

  • 如果希望设置a的所有结果,请使用左外连接,但是 如果设置b具有与某些设置的记录相关的数据,那么您也是 我也希望在同一个查询中使用这些数据。

请参考下图:

SQL Joins

答案 2 :(得分: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

如果您INNER JOIN sub_sub_table,即使您在sub_table上执行了LEFT JOIN,它也会立即缩小您的结果集。

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

但是,你提到你有一个where语句来过滤你正在寻找的行,所以关于JOIN的问题是null&amp;因为这不是你真正的问题。 (如果我理解你的评论,那就是这样)