内部连接与十字连接对十字应用
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