【问题标题】:Copy data to temporary table from two different databases having same table in SQL将数据从具有相同 SQL 表的两个不同数据库复制到临时表
【发布时间】: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


【解决方案1】:

您可以使用UNION ALL 解决它,但请注意#temptbl_Records 表必须具有相同的结构(列和数据类型)。

SELECT 
    *
INTO 
    #copy
FROM (
    SELECT * 
    FROM #temp

    UNION ALL

    SELECT * 
    FROM [Records2021]..[tbl_Records]
) AS tbl
WHERE 
    tbl.isdeleted = 0

如果表结构不同,请对一张表使用SELECT ... INTO,对第二张表使用所需的列调整INSERT INTO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 2014-02-20
    • 2010-12-29
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多