SQL Server如何执行这两个查询,有什么区别:
选择加入
SELECT *
FROM AspNetUsers
LEFT JOIN AspNetUserRoles ON AspNetUsers.Id = AspNetUserRoles.UserId
LEFT JOIN AspNetRoles ON AspNetUserRoles.RoleId = AspNetRoles.Id
选择不加入
SELECT *
FROM AspNetUserRoles, AspNetUsers, AspNetRoles
WHERE AspNetUsers.Id = AspNetUserRoles.UserId
AND AspNetUserRoles.RoleId = AspNetRoles.Id
我得到的结果是相同的,除了列的顺序。
答案 0 :(得分:0)
您必须使用SQL Server“实际执行计划”(按下SQL Server Management Studio中的“实际执行计划”按钮),以帮助您找到SQL Server执行它们的方式的区别。
如果它是“INNER JOIN”VS“没有加入”那么SQL Server将足够智能,使它们相同。
但是“LEFT JOIN”VS“没有加入”有不同的结果,也有不同的执行计划
答案 1 :(得分:0)
我不使用SQL Server,但我不认为它与SQL的基本方面(例如您的问题中涉及的那些)的其他DBMS不同[1]。 虽然请注意我的答案仅基于一般 SQL经验(例如dBase,Informix,Paradox,Oracle,显然是MySQL)
也就是说,我不希望您的两个版本之间存在不同的行为,因为您只使用ON
和简单的WHERE
条件,因此它绝对等同于使用AspNetUsers
方法
然而,我很惊讶您报告只有列的订单不同。实际上,在您的#1版本中,您只能获得{{1}}表的那些,而#2应该返回所有表的所有列。
[1]在阅读了@Atheer Mostafa的答案之后添加:更确切地说,SQL Server可能内部工作不同,但结果应该相同。