2012-09-10 209 views
1

我试图选择我认为是两种选择来获取相同的数据。联盟的联盟与联盟的联盟

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

我可以看到将此查询结构化为1连接到4个表的联合,或者作为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 

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

+0

我对你的应用程序一无所知,但是好像数据可能在单个表格中添加了一个像“type”这样的列来代替旧的表名。那么你根本不需要联盟。查询将变得更简单和易于维护(这是非常重要的),你甚至可能得到一个小小的性能提升。 – 10flow

+2

在sql-server中你可以检查执行计划 –

回答

0

这将取决于你的数据看起来像每个表中的行数,所以你最好的选择是尝试两种方法,看看是否更好。

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

0

SQL Server可以将第一个转换为第二个而不是相反。这就是说,没有办法知道哪个更好,因为它取决于很多事情(行数,过滤器选择性......)。唯一可靠的答案是看计划和/或测试。