【发布时间】:2017-03-03 19:37:35
【问题描述】:
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 vs cross apply,这里是:stackoverflow.com/questions/1139160/… -
不太重复,因为另一个主要关注何时使用交叉应用,但如果你的断言是正确的,交叉连接应该被彻底拒绝,我认为另一篇文章建议交叉应用应该比 INNER JOIN 快。当只拉一张唱片时会是这种情况,还是真的没有区别,而这更像是个人喜好?
-
您的示例查询在尝试比较这些不同操作的上下文中没有意义。您本质上是通过三种不同的方式将一个常量值添加到您的查询中。您也可以只使用局部变量或在您的选择中使用子查询。
SecRoleID与您查询的其余部分没有关系。 -
你是对的。我正在尝试将适当的 SecRoleID 添加到插入的每条记录中。它可以是一个局部变量(使用 SELECT 来设置它 WHERE Name = 'Viewer'),或者是一个子查询。您觉得其中任何一个解决方案都比使用 Cross Apply 更好吗?
标签: sql sql-server join