为源表的一行中的每一列插入目标表的新条目

Posted

技术标签:

【中文标题】为源表的一行中的每一列插入目标表的新条目【英文标题】:INSERT INTO target table new entry for each column within a row of source table 【发布时间】:2020-06-02 20:06:15 【问题描述】:

如果标题令人困惑,我很抱歉。我有一个非常大的源表,其结构有点像这样

From Mile  | To Mile |
           |         |From Weight| 1000       | 1100 | 1200 | 1300... | 22500 | 23000
           |         |To Weight  | 1099       | 1199 | 1299 | 1499... | 22999 | 23499
==========================================================================
     1     |   20    |           | 1500       | 1505 | 1489 | 1854... | 3400  | 2990
------------------------------------------------------------------------
     21    |   40    |           | 1400       | 1705 | 491  | 5581... | 1600  | 2989
------------------------------------------------------------------------
     41    |   60    |           | 1800       | 1635 | 1982 | 1888... | 3200  | 3480
------------------------------------------------------------------------

人们可以选择特定里程的地方,例如23,以及一定的重量,例如1250,并获得一个“比率”——在本例中为 491。

From Mile  | To Mile |
           |         |From Weight|            |      | 1200 |         |       |
           |         |To Weight  |            |      | 1299 |         |       | 
==========================================================================
           |         |           |            |      |      |     ... |       | 
------------------------------------------------------------------------
     21    |   40    |           |            |      | 491  |     ... |       | 
------------------------------------------------------------------------
           |         |           |            |      |      |     ... |       | 
------------------------------------------------------------------------

我想插入每个费率及其相应的重量和英里范围。

Id   | Mile_To | Mile_From | Weight_To | Weight_From | Rate
===========================================================
0    | 1       | 20        | 1000      | 1099        | 1500
-----------------------------------------------------------
1    | 1       | 20        | 1100      | 1199        | 1505
-----------------------------------------------------------
2    | 1       | 20        | 1200      | 1299        | 1389
-----------------------------------------------------------
3    | 1       | 20        | 1300      | 1499        | 1854
-----------------------------------------------------------
...
-----------------------------------------------------------
40   | 1       | 20        | 22500     | 22999       | 3400
-----------------------------------------------------------
41   | 1       | 20        | 23000     | 23499       | 2990
-----------------------------------------------------------
42   | 21      | 40        | 1000      | 1199        | 1400

单步执行源表并按上述格式插入数据的最佳方法是什么?大约有数百行和列,因此命名每一列类似于手动输入数据。

这是一个带有源表示例的 SQLFiddle:http://sqlfiddle.com/#!18/48777a/1

【问题讨论】:

我不会给出完整的答案,但这里有一个提示:使用 CROSS JOIN 生成表。如果“重量类别”与示例中的一样可预测(步数为 1000),您可能可以生成一系列重量类别,生成一系列英里类别,然后交叉连接这些以创建您的结果表。唯一复杂的部分是填写“rate”列,这将是一个相当丑陋的源表 JOIN。 @workerjoe 感谢您的帮助,下面发布了一个 CROSS JOIN 答案,效果很好! 【参考方案1】:

您可以使用cross apply 取消透视此数据集:

select 
    s.from_miles,
    s.to_miles,
    x.*
from source s
cross apply (values
    (1000, 1099, s.[1000_to_1099]),
    (1100, 1199, s.[1100_to_1199]),
    (1200, 1299, s.[1200_to_1299]),
    (1300, 1399, s.[1300_to_1399]),
    (1400, 1499, s.[1400_to_1499])
) as x(weight_from, weigh_to, rate)

您可以轻松地将其转换为 insert 声明:

insert into newtable (from_moles, to_moles, weight_from, weight_to, rate)
select ... -- above query

【讨论】:

这很完美!我知道必须有一种更简单的方法来做到这一点!如果你相信的话,原始代码是 16,000 行。 我用单页 merge 重写了一个 800 行的脚本。 16K 行虽然可笑!

以上是关于为源表的一行中的每一列插入目标表的新条目的主要内容,如果未能解决你的问题,请参考以下文章

当源表的一行中的多个列与目标表中单行的相同列匹配时,从目标 spark delta 表中删除一行

Redshift:使用来自另一个表的随机数据更新或插入列中的每一行

sql将查询结果插入到表的每一列中

如何在表的每一行中查找哪一列包含特定值

您可以在 PHP/MySQL 数据库表的每一行中创建/插入表吗?

Google Spanner - 如何将数据复制到另一个表?