你如何使用模式差异的UNION表?

时间:2013-07-22 16:27:46

标签: sql database sql-server-2008 database-administration

我目前正在处理与当年相关的数据集。与每年相关的数据存放在单独的表格中。查询数据时,使用UNION ALL查询完成。

不幸的是,过去提供的数据集与当前年份的模式不共享,一些字段已添加,一些已退役,另一些已重命名。我无法控制这一点。

在这种情况下,当架构不同时,如何在这些表中执行UNION ALL查询?差异不是很大,但它们的偏差足以引起问题。

有什么建议吗?

我是否将所有内容合并到一个大表中,包括跨越所有年份的所有字段,然后在它们出现时添加新的字段?或者,我是否继续将这些表分开?

1 个答案:

答案 0 :(得分:2)

嗯,首先,不要尝试使用SELECT *来UNION(实际上UNION ALL可能更合适)。

你可以:

  • 将列添加到没有特定列的集合中,使用令牌默认值/ NULL值
  • 转换当前“相同”但使用不兼容类型的列
  • 只留下不常见的列,包括

例如:

DECLARE @a TABLE(d DATE, c INT, x FLOAT);

DECLARE @b TABLE(d DATETIME, c VARCHAR(32));

DECLARE @c TABLE(d DATE, x INT, y INT);

SELECT d, c = CONVERT(VARCHAR(32), c), x = CONVERT(INT, x) FROM @a
UNION ALL
SELECT CONVERT(DATE, d), c, x = NULL FROM @b
UNION ALL 
SELECT d, c = 'not supplied', x FROM @c;