0

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

不幸的是,过去提供的数据集与当年的数据集不共享相同的架构,一些字段已添加,一些已停用,还有一些已重命名。我无法控制这一点。

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

有什么建议么?

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

4

1 回答 1

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;
于 2013-07-22T16:31:19.783 回答