Sql server 联合与联合的联合

Sql server 联合与联合的联合,sql-server,Sql Server,我试图在两种选择中做出选择,以获得相同的数据 我有一个表包含感兴趣的ID,还有一组4个相互类似的表,其中包含这些ID的数据。一旦我有了每个ID的行,我将使用它们来获取4个表中的最大状态字段或最小日期字段等 我可以将此查询构造为4个表的并集的1个联接,或4个联接的并集。哪个更有效?FWIW,我发现第一个更容易理解,也可能更容易维护 列出两个选择: 将idTable与联合在一起的4个表中的一个子集联接: select ss.id, ss.study, ss.status, ss.date from

我试图在两种选择中做出选择,以获得相同的数据

我有一个表包含感兴趣的ID,还有一组4个相互类似的表,其中包含这些ID的数据。一旦我有了每个ID的行,我将使用它们来获取4个表中的最大状态字段或最小日期字段等

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

列出两个选择:

将idTable与联合在一起的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

或者除此之外还有更好的选择吗?

这取决于数据在每个表中的行数,因此最好的选择是尝试这两种方法,看看其中一种是否更好


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

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


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

我对您的应用程序一无所知,但似乎数据可以在一个表中,添加一个类似列的类型来代替旧表名。那你就根本不需要工会了。查询将变得更加简单和易于维护,这一点非常重要,您甚至可能会得到一点性能提升