【发布时间】:2021-07-17 10:14:35
【问题描述】:
我有两个数据库。一个数据库有当年的数据,另一个有上一年的数据。
我想从名为tbl_Records 的表中将数据复制到临时表中,该表在数据库和临时表中的数据中都可用。我也使用了内连接。
select a.*
into #copy
from #temp t
inner join Records2021..tbl_Records r on t.uniqueno = r.uniqueno
where isdeleted = 0
tbl_Records 表有大约 150 列,并且所有列都是必需的。因此首选*
现在我需要包含上一年的数据库Records2020。我该怎么做?
使用 CTE 可能会有所帮助。但问题是我需要为相同的列指定所有列名,这很乏味。有没有一种更简单的方法来做到这一点,因为我需要在针对不同表的近 50-60 个不同的存储过程中实现这一点。
我的最终目标只是将两个数据库中的数据一起放入一个临时表中。
代码尝试:
If object_id('tempdb..#copy') is not null
begin
drop table #copy
end
If object_id('tempdb..#temp') is not null
begin
drop table #temp
end;
with cte as
(
select a.*
from #temp t
inner join Records2021..tbl_Records r on t.uniqueno = r.uniqueno
where isdeleted = 0
union all
select a.*
from #temp t
inner join Records2020..tbl_Records r on t.uniqueno = r.uniqueno
where isdeleted = 0
)
select a.*
into #copy
from cte /*this does not work as I need to mention all 150 columns here.*/
我也愿意接受任何其他选择。
数据库管理系统:Microsoft SQL Server
【问题讨论】:
-
您使用的是哪个 dbms? (上面的代码是特定于产品的。)
-
Microsoft SQL Server 2014
-
150 列通常是设计缺陷,因为不同年份有单独的表
-
@Charlieface 你能简单介绍一下这是一个设计缺陷吗?
-
一个索引良好的表不应该因为它的大小而引起很多性能问题。一百万行在 B 树中最多需要 20 次查找,十亿行最多只需要 30 次查找,换句话说
log2(n)。不要因为“性能”而破坏您的设计,还有更好的解决方案。如果您的表被正确规范化,您的 性能 问题也会少得多(可以有一个包含许多列的规范化表,但不太可能)。
标签: sql sql-server common-table-expression temp-tables union-all