【问题标题】:Insert a tableA into another tableB with a different structure将 tableA 插入另一个具有不同结构的 tableB
【发布时间】:2021-03-01 12:17:32
【问题描述】:

我有一张桌子 A 看起来像:

 id isin    typ1    typ2                                                                                 
  1 aa      typA    typB                                                                                 
 2  bb      typD    typC

我需要插入一个如下所示的表 B:

id  isin    fld     value                                                                                
 1   aa     typ1    typA                                                                                 
 2   aa     typ2    typB                                                                                 
 3   bb     typ1    typD                                                                                 
 4   bb     typ2    typC

我可以使用 SQL 指令吗?

【问题讨论】:

  • 插入 SELECT ... UNION ALL ...
  • 你期望的结果是什么?
  • @Giovanni 。 . .用您正在使用的数据库标记您的问题。

标签: sql union sql-insert unpivot lateral-join


【解决方案1】:

最通用的方法是union all

insert into tableb (id, isin, fld, value)
select id, isin, 'typ1', typ1 from tablea
union all select id, isin, 'typ2', typ2 from tablea

如果您没有披露的数据库支持横向连接,则可以使用此功能更有效地完成此操作。典型的语法是:

insert into tableb (id, isin, fld, value)
select a.id, a.isin, x.fld, x.value
from tabla a
cross join lateral (values ('typ1', typ1), ('typ2', typ2)) as x(fld, value)

横向连接的确切语法因数据库而异。

【讨论】:

  • 我正在使用 MS Acces,第一个解决方案不起作用,我不知道为什么....问题似乎与 INSERT INTO 部分有关...
【解决方案2】:

您可以使用 ROW_NUMBER() 分析函数和 UNION ALL 来插入未透视的值和重枚举的 id 值

INSERT INTO tableB(id, isin, fld, value)
SELECT ROW_NUMBER() OVER (ORDER BY isin, fld), A.* 
  FROM 
  (
   SELECT isin, 'typ1' AS fld, typ1 AS typ FROM tableA UNION ALL
   SELECT isin, 'typ2'       , typ2        FROM tableA
  ) AS A

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2014-11-24
    • 1970-01-01
    相关资源
    最近更新 更多