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

时间:2018-01-25 15:45:14

标签: sql sql-server

我有一个表,其中字段可以具有不同的值,具体取决于一个字段。如果ufd.table_code ='case',那么ufd.user_field_data_01 =会员ID,但是如果ufd.table_code ='appe'则ufd.user_field_data_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_code,可能会变大)。对我来说,第一个更具可读性。我只是好奇哪个效率更高,性能更好?或者它们是否足够相同以至于无关紧要?

谢谢!

1 个答案:

答案 0 :(得分:1)

这两者并不完全相同。

据推测,每个主密钥在@RunWith(RobolectricTestRunner::class) class TestClass { ... } 中有多行。因此,第一个查询的等价物将是:

ufd

(好吧,我加了钥匙。)

我认为这是你想要的实际结果集。

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

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

相关问题