哪些选择语句"更好",为什么?

Bha*_*kar 8 sql sql-server

我有2个人和角色.我必须以角色为基础的所有人.

select person.* from person inner join role on
person.roleid = role.id Where role.id = @Roleid
Run Code Online (Sandbox Code Playgroud)

要么

select person.* from person inner join role on
person.roleid = role.id AND role.id = @Roleid
Run Code Online (Sandbox Code Playgroud)

以上哪两种解决方案更好,为什么?

cha*_*aos 13

第一个更好,因为它在逻辑上是连贯的.范围条件与连接无关,因此将其作为连接的一部分是一个kludge,在这种情况下是无用的.

  • 虽然在至少一个案例中,我发现如果我将范围放入连接语句中,"解释计划"给了我更好的结果. (3认同)

Cad*_*oux 9

关系代数没有区别.来自这里和内部联接的标准是可以互换的.我根据可读性和情况使用两者.

在这种特殊情况下,您还可以使用:

select person.* from person WHERE person.roleid = @Roleid
Run Code Online (Sandbox Code Playgroud)

唯一的区别是它不需要在角色表中存在一行(但我假设您具有参照完整性),如果roleid不是唯一的,它将不会返回多行(几乎可以肯定在大多数情况下我都是可以预见).


Gav*_*ler 8

最好的办法是尝试这些查询并通过MS Sql的执行计划运行它们.我做了这个,结果看起来像这样:

显示相同查询性能的执行计划http://img223.imageshack.us/img223/6491/querycompare.png

正如您所看到的,性能是相同的(授予,在您的数据库上运行它可能会产生不同的结果.)因此,最佳查询是遵循您用于编写查询的一致约定的查询.


Tom*_*m H 2

SQL Server 应该以相同的方式评估这些查询。就我个人而言,我会使用 AND。我喜欢将连接表的所有条件保留在连接本身中,以便它们全部放在一起并且易于查找。