动态地使用Union All合并查询

时间:2018-11-20 01:16:52

标签: sql sql-server

我有三个表:

    Table A                  Table B                     Table C
 ______________            ______________             ______________
| Order | Year |          | Order | Year |           | Order | Year | 
+--------------+          +--------------+           +--------------+
| O1-17 | 2017 |          | O1-18 | 2018 |           | O1-19 | 2019 |
+--------------+          +--------------+           +--------------+

我使用UNION ALL合并了这些表。

SELECT Order,Year FROM [Table A]
UNION ALL
SELECT Order,Year FROM [Table B]
UNION ALL
SELECT Order,Year FROM [Table C]

我的问题是,每年都有一个新表要添加。一个示例是具有相应记录顺序O1-20和年份2020的表D。除了添加另一组UNION ALL,还有其他方法可以达到相同的结果。

1 个答案:

答案 0 :(得分:1)

您可以想到3种选择:

1)每年手动更新查询中的并集-不理想,但可能比选项2更好。

2)使用动态SQL来构建查询,它可以根据查询的运行日期自动构建查询。这有点丑陋,而且性能可能不佳。

3)这是我的首选,运行常规维护任务以仅使用报告所需的数据填充单个数据库中的完全独立的表。


选项2可能类似于:

declare @StartYear int = 2015, @EndYear int = datepart(year, getdate()), @sql nvarchar(max) = '', @Index int;
set @Index = @StartYear;

declare @Years table ([Name] varchar(128));

while @Index <= @EndYear begin
  insert into @Years ([Name])
    select 'BaseTableName' + convert(varchar, @Index);
  set @Index = @Index+1;
end

select @sql = @sql + case when len(@sql) > 0 then ' union all ' else '' end + 'select [Order], [Year] from ' + [Name]
from @Years

select @sql
--exec(@sql)