联盟全部 - 3个表,2个永远不会包含重复项,另一个将会重复

时间:2013-03-19 18:28:24

标签: tsql sql-server-2005 union union-all

我知道工会所有的问题都被问了很多,但我有一点点变化。我将在三个不同的查询/表集上进行联合。根据他们的查询定义,前2个将永远不会有重复,但第三个肯定会有重复。

我的问题是,我做工会/工会的顺序是否重要。例如,我应该在我的前2个表上执行UNION ALL,这些表不会有重复项(并且永远不会),然后对第三个表执行UNION,因为它会有重复项吗?或者如果顺序颠倒,顺序会更好吗?或者没关系?

这不是一个真正紧迫的问题,只是想知道在这种情况下是否有最佳实践。

1 个答案:

答案 0 :(得分:3)

UNION ALL返回所有行,无需额外处理。一个简单的UNION对整个行集进行排序以消除重复。虽然优化器可能能够通过研究索引和约束来解决所有问题,但您总是可以像这样给它一点:

  select * from table1
union all
  select * from table2
union all
  select *
  from (
    SELECT DISTINCT * from table3
  ) T

这确保了只对table3执行sort-and-elimination-duplicatelicates。

任何时候都可以简单明了地将意图传达给人类用户和编译器,这几乎可以肯定是编写代码的正确方法。在这种情况下,性能也可能会提高,并且不会降低。