1

我试图在我认为获得相同数据的两种选择之间进行选择。

我有一个包含感兴趣的 ID 的表,以及一组 4 个彼此相似的表,其中包含这些 ID 的数据。一旦获得每个 ID 的行,我将使用它们来获取最大状态字段或最小日期字段等(跨越 4 个表)。

我可以看到将此查询构造为 1 个连接到 4 个表的联合,或作为 4 个连接的联合。哪个更有效率?FWIW,我发现第一个更容易理解,并且可能更容易维护。

拼写出两个选择:

将 idTable 与 UNION 在一起的 4 个表的子选择结合起来:

select ss.id, ss.study, ss.status, ss.date
from ( -- subselect ss
        select tx.id, tx.study, tx.status, tx.date
      from table_tx tx
    UNION  
    select cfu.id, cfu.study, cfu.status, cfu.date
      from table_cfu cfu
    UNION  
    select sfu.id, sfu.study, sfu.status, sfu.date
      from table_sfu sfu
    UNION  
    select bsl.id, bsl.study, bsl.status, bsl.date
      from table_bsl bsl
  ) ss
inner join 
idTable id on id.id = ss.id AND id.study = ss.study

idTable 的联合与四个中的每一个相结合:

select tx.id, tx.study, tx.status, tx.date
  from table_tx tx
  inner join 
  idTable id on id.id = tx.id AND id.study = tx.study
UNION  
select cfu.id, cfu.study, cfu.status, cfu.date
  from table_cfu cfu
  inner join 
  idTable id on id.id = cfu.id AND id.study = cfu.study
UNION  
select sfu.id, sfu.study, sfu.status, sfu.date
  from table_sfu sfu
  inner join 
  idTable id on id.id = sfu.id AND id.study = sfu.study
UNION  
select bsl.id, bsl.study, bsl.status, bsl.date
  from table_bsl bsl
  inner join 
  idTable id on id.id = bsl.id AND id.study = bsl.study

或者除了这些还有更好的选择吗?

4

2 回答 2

0

SQL Server 可以将第一个转换为第二个,但不能反过来。

也就是说,没有办法知道哪个更好,因为它取决于很多事情(行数,过滤器选择性,......)。唯一合理的答案是查看计划和/或测试。

于 2012-10-06T13:00:20.863 回答
0

这将取决于您的数据在每个表中的行数方面是什么样的,因此您最好的选择是尝试这两种方法,看看是否有更好的方法。

但是,如果我假设您的每个表 tx、cfu、sfu 和 bsl 都包含一百万行,那么我希望在合并它们之前将这 4 个大集合限制为一行会更快,而不是创建一个 4 -百万行集,然后加入它。

于 2012-09-10T17:49:18.473 回答