Sql 哪一个更好-多个连接到同一个表或在一个案例中过滤?

Sql 哪一个更好-多个连接到同一个表或在一个案例中过滤?,sql,sql-server,Sql,Sql Server,我有一个表,根据一个字段是什么,字段可以有不同的值。如果ufd.table\u code='case',则ufd.user\u field\u data\u 01=成员id,但如果ufd.table\u code='appe',则ufd.user\u field\u data\u 01=上诉id 我通常这样做: select UfdCase.user_field_data_01 ,UfdAppe.user_field_data_01 from MainTable (nolock)

我有一个表,根据一个字段是什么,字段可以有不同的值。如果ufd.table\u code='case',则ufd.user\u field\u data\u 01=成员id,但如果ufd.table\u code='appe',则ufd.user\u field\u data\u 01=上诉id

我通常这样做:

select UfdCase.user_field_data_01
      ,UfdAppe.user_field_data_01
  from MainTable (nolock)
       left join ufd as UfdCase (nolock) on UfdCase.keyid = MainTable.keyid and UfdCase.table_code = 'case'
       left join ufd as UfdAppe (nolock) on UfdAppe.keyid = MainTable.keyid and UfdAppe.table_code = 'appe'
但我也可以这样做:

select case when ufd.table_code = 'case' then ufd.user_field_data_01 else '' end,
       case when ufd.table_code = 'appe' then ufd.user_field_data_01 else '' end
  from MainTable (nolock)
       left join ufd (nolock) on ufd.keyid = MainTable.keyid
这大大简化了(我有一些非常大的case语句,如果我必须检查它是哪个table_代码,它们可能会变得更大)。对我来说,第一个更具可读性。我只是好奇哪个更有效,性能更好?或者他们是否足够平等,身份不重要


谢谢

这两者并不完全相同

大概每个主密钥在
ufd
中都有多行。因此,第一个查询的等效值为:

select mt.keyid,
       max(case when ufd.table_code = 'case' then ufd.user_field_data_01 end),
       max(case when ufd.table_code = 'appe' then ufd.user_field_data_01 end)
from MainTable mt left join
     ufd
     on ufd.keyid = mt.keyid
where ufd.table_code in ('case', 'appe')
group by mt.keyid;
(好吧,我加了钥匙。)

我假设这是您想要的实际结果集

哪个更好?我通常采用条件聚合路线,因为它更容易扩展到更多列和更复杂的逻辑。额外的列只会增加很少的额外开销


从性能的角度来看,您需要进行测试。但是有了正确的索引,如果第二种方法更好——对于两列,我也不会感到惊讶。对于附加列或更复杂的逻辑,条件聚合方法在性能方面更为一致。

我认为第二种方法比第一种更好。真正找到答案的最佳方法是测试。
CASE
表达式可能更快,因为它不需要进一步解析表,但也取决于索引。另外,您使用
NOLOCK
的原因是什么?你知道这是怎么回事,对吧?是的,一个没有表结构或索引细节的大大简化的查询是不可能回答的。为了进一步说明NOLOCK提示是一个坏主意的概念,你可能想看看这个。老实说,我没有意识到诺洛克的所有这些问题。我知道一些,当这些都好的时候就用它。然而,我现在正在重新思考这一切。非常感谢您的链接,这是非常有益的!谢谢你的想法和信息!是的,我确实需要测试它,现在我的查询都在5秒内运行,所以我不太担心。但是,我将测试那些最终需要更长时间的查询——我可以以任何方式让用户更快地进行测试。:)