加入联盟与工会联盟

时间:2012-09-10 17:34:26

标签: sql-server

我正在尝试在我认为两种选择之间做出选择以获得相同的数据。

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

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

说出两个选择:

将idTable与4个UNIONed表的子选项加在一起:

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

SQL Server可以将第一个转换为第二个而不是相反的转换。

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