内部连接与十字连接对十字应用

SQL的乐趣之一是,通常有多种方式来做同样的事情,所以哪个是“最好的”?

在这种情况下,我从“导入”表中插入记录,并为它们提供默认安全级别“查看器”(可能在不同数据库中具有不同的密钥ID)。 我可以通过至少三种不同的方式来做到这一点(甚至可能还有更多):CROSS JOIN,CROSS APPLY和INNER JOIN。 任何关于哪种方式最适合于性能或设计目的的建议? 我倾向于交叉应用。

这个问题可能已经得到解答,但我找不到它,最近我在开发过程中一直遇到这种需求,所以我不妨学习最好的方法。

以下是3个示例语句。 哪个是加入SecRole表的最好方法?

INSERT INTO LocStaff (LocationID, StaffID, SecRoleID)
    SELECT i.LocationID, s.StaffID, sr.SecRoleID
    FROM IntStaff i
        JOIN Staff s ON i.EmployeeID = s.StaffNumber
        CROSS JOIN SecRole sr
    WHERE sr.Name = 'Viewer' 

INSERT INTO LocStaff (LocationID, StaffID, SecRoleID)
    SELECT i.LocationID, s.StaffID, sr.SecRoleID
    FROM IntStaff i
        JOIN Staff s ON i.EmployeeID = s.StaffNumber
        JOIN SecRole sr ON sr.Name = 'Viewer'

INSERT INTO LocStaff (LocationID, StaffID, SecRoleID)
    SELECT i.LocationID, s.StaffID, sr.SecRoleID
    FROM IntStaff i
        JOIN Staff s ON i.EmployeeID = s.StaffNumber
        CROSS APPLY (SELECT TOP 1 SecRoleID FROM SecRole WHERE Name = 'Viewer') sr

前两个是相同的。 在这种情况下,使用内连接还是交叉连接实际上是一个优先事项。 我想我通常会使用cross join ,因为表之间没有真正的连接条件。

注意:如果意图是具有表间匹配条件的“真实” inner join ,则不应使用cross join联接。

cross apply不是做同样的事情。 它只是选择一行。 如果你的意图是最多只有一个匹配的行,那么使用cross apply 。 如果打算获得恰好一个匹配的行,则使用outer apply


只有在表格之间没有任何共同的列(不是最好的结构设计!)或我们需要所有可能的情况下,我们才使用交叉连接(或只是关键字连接)。 我不知道你的表结构,但我假设表SecRole没有外部或共同的关键员工和InsStaff。 在这种情况下,我会在这里使用右连接(外连接)来获取Staff和InsStaff之间的第一个内连接的所有结果,然后将它们放在SecRole期望的记录旁边。

这是Right join的概念http://www.dofactory.com/sql/right-outer-join

链接地址: http://www.djcxy.com/p/86227.html

上一篇: INNER JOIN vs CROSS JOIN vs CROSS APPLY

下一篇: get count and column value from two tables for a report