我试图选择我认为是两种选择来获取相同的数据。联盟的联盟与联盟的联盟
我有一个表有感兴趣的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
或者除了这些还有更好的选择吗?
我对你的应用程序一无所知,但是好像数据可能在单个表格中添加了一个像“type”这样的列来代替旧的表名。那么你根本不需要联盟。查询将变得更简单和易于维护(这是非常重要的),你甚至可能得到一个小小的性能提升。 – 10flow
在sql-server中你可以检查执行计划 –