代码之家  ›  专栏  ›  技术社区  ›  user240141

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

  •  34
  • user240141  · 技术社区  · 14 年前

    我知道连接的用法,但有时遇到这样的情况,我无法决定 参加 适合,A 向左或向右 .

    这是我被困的地方。

        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 回复  |  直到 8 年前
        1
  •  97
  •   Community CDub    7 年前

    是的,这取决于你的处境。

    为什么使用SQL连接?

    answer :每当必须通过SQL select语句访问多个表时使用SQL联接,如果联接的表之间不匹配,则不应返回任何结果。

    阅读这篇关于 The code project 将对您有很大帮助: Visual representation of sql joins

    还请查看以下文章: sql-server“better-performance”左侧join or-not-in?

    在mysql中的join和outer join之间的差异/3183687 3183687“>mysql中join和outer join之间的差异

    回答
    :只要必须通过SQL Select语句访问多个表,就使用SQL联接;如果联接的表之间不匹配,则不应返回任何结果。

    阅读这篇关于 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 .

        2
  •  9
  •   WonderWorker Sakal    8 年前

    分两组:

    • 当需要两个集合的所有结果时,请使用完整的外部联接。

    • 如果只希望结果同时出现在 集:

    • 当需要集合A的所有结果时,使用左外部联接,但是 如果集合B具有与集合A的某些记录相关的数据,那么您也可以 也希望在同一查询中使用该数据。

    请参考下图:

    当您只希望结果同时出现在 集合。

  • 当需要集合A的所有结果时,使用左外部联接,但是 如果集合B具有与集合A的某些记录相关的数据,那么您也可以 也希望在同一查询中使用该数据。

  • 请参阅下图:

    SQL Joins

        3
  •  5
  •   Pranay Rana    14 年前

    我想你要做的是 LEFT JOIN 从主表开始返回主表中的所有记录,无论它们在联接的表中是否有有效数据(如图中左上角的2个圆圈所示)

    联接是连续发生的,因此如果您有4个表要联接,并且总是希望主表中的所有记录,则需要继续 左连接 贯穿始终,例如:

    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 子表,它将立即缩小您的结果集,即使您做了一个 左连接 在子表上。

    记住,做的时候 左连接 ,您需要说明 NULL 返回的值。因为如果没有记录可以与主表联接,则 左连接 强制该字段无论如何都显示,并且将包含空值。 内连接 显然只会“丢弃”行,因为这两个行之间没有有效的链接(根据您加入的ID没有相应的记录)

    但是,您提到您有一个WHERE语句,它过滤掉您要查找的行,因此您在联接上的问题是空的,因为这不是您真正的问题。(如果我能正确理解你的评论)