mysql - 需要将数据从一张表加载到另一张表

标签 mysql data-warehouse unpivot

初始行数据位于下表中 -

create table offer_row_data ( 
customer_key char(20), 
offer1_id char(20), 
offer1_cd char(20), 
offer1_brand_nm char(20), 
offer2_id char(20), 
offer2_cd char(20), 
offer2_brand_nm char(20), 
offer3_id char(20), 
offer3_cd char(20), 
offer3_brand_nm char(20), 
offer4_id char(20), 
offer4_cd char(20), 
offer4_brand_nm char(20)
);

我需要对其进行转换并加载到下表中...

create table offer_data (
offer_key INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
offer_id char(20) NOT NULL,
offer_cd char(20) NOT NULL,
offer_brand_nm char(20));

这是一些随机数据-

INSERT INTO offer_row_data VALUES ('1','offer_id_1a','offe3_cd_1a','offer_nm_1a','offer_id_1b','offe3_cd_1b','offer_nm_1b','offer_id_1c','offe3_cd_1c','offer_nm_1c','offer_id_1d','offe3_cd_1d','offer_nm_1d');
INSERT INTO offer_row_data VALUES ('2','offer_id_2a','offe3_cd_2a','offer_nm_2a','offer_id_2b','offe3_cd_2b','offer_nm_2b','offer_id_2c','offe3_cd_2c','offer_nm_2c','offer_id_2d','offe3_cd_2d','offer_nm_2d');
INSERT INTO offer_row_data VALUES ('3','offer_id_3a','offe3_cd_3a','offer_nm_3a','offer_id_3b','offe3_cd_3b','offer_nm_3b','offer_id_3c','offe3_cd_3c','offer_nm_3c','offer_id_3d','offe3_cd_3d','offer_nm_3d');

这是我的解决方案 -

INSERT INTO offer_data (offer_id,offer_cd,offer_brand_nm) 
(SELECT distinct offer1_id, offer1_cd, offer1_brand_nm FROM offer_row_data)
UNION
(SELECT distinct offer2_id, offer2_cd, offer2_brand_nm FROM offer_row_data)
UNION
(SELECT distinct offer3_id, offer3_cd, offer3_brand_nm FROM offer_row_data)
UNION
(SELECT distinct offer4_id, offer4_cd, offer4_brand_nm FROM offer_row_data)

由于我拥有 2500 万个数据集,因此这将成为性能负担,并期待更有效的解决方案

示例:

输入:

+--------------+-------------+-------------+-----------------+-------------+-------------+-----------------+-------------+-------------+-----------------+-------------+-------------+-----------------+
| customer_key | offer1_id   | offer1_cd   | offer1_brand_nm | offer2_id   | offer2_cd   | offer2_brand_nm | offer3_id   | offer3_cd   | offer3_brand_nm | offer4_id   | offer4_cd   | offer4_brand_nm |
+--------------+-------------+-------------+-----------------+-------------+-------------+-----------------+-------------+-------------+-----------------+-------------+-------------+-----------------+
| 1            | offer_id_1a | offe3_cd_1a | offer_nm_1a     | offer_id_1b | offe3_cd_1b | offer_nm_1b     | offer_id_1c | offe3_cd_1c | offer_nm_1c     | offer_id_1d | offe3_cd_1d | offer_nm_1d     |
| 2            | offer_id_2a | offe3_cd_2a | offer_nm_2a     | offer_id_2b | offe3_cd_2b | offer_nm_2b     | offer_id_2c | offe3_cd_2c | offer_nm_2c     | offer_id_2d | offe3_cd_2d | offer_nm_2d     |
| 3            | offer_id_3a | offe3_cd_3a | offer_nm_3a     | offer_id_3b | offe3_cd_3b | offer_nm_3b     | offer_id_3c | offe3_cd_3c | offer_nm_3c     | offer_id_3d | offe3_cd_3d | offer_nm_3d     |
+--------------+-------------+-------------+-----------------+-------------+-------------+-----------------+-------------+-------------+-----------------+-------------+-------------+-----------------+

预期输出:

+-----------+-------------+-------------+----------------+
| offer_key | offer_id    | offer_cd    | offer_brand_nm |
+-----------+-------------+-------------+----------------+
|         1 | offer_id_1a | offe3_cd_1a | offer_nm_1a    |
|         2 | offer_id_2a | offe3_cd_2a | offer_nm_2a    |
|         3 | offer_id_3a | offe3_cd_3a | offer_nm_3a    |
|         4 | offer_id_1b | offe3_cd_1b | offer_nm_1b    |
|         5 | offer_id_2b | offe3_cd_2b | offer_nm_2b    |
|         6 | offer_id_3b | offe3_cd_3b | offer_nm_3b    |
|         7 | offer_id_1c | offe3_cd_1c | offer_nm_1c    |
|         8 | offer_id_2c | offe3_cd_2c | offer_nm_2c    |
|         9 | offer_id_3c | offe3_cd_3c | offer_nm_3c    |
|        10 | offer_id_1d | offe3_cd_1d | offer_nm_1d    |
|        11 | offer_id_2d | offe3_cd_2d | offer_nm_2d    |
|        12 | offer_id_3d | offe3_cd_3d | offer_nm_3d    |
+-----------+-------------+-------------+----------------+

最佳答案

如果您使用 CTE,它仅读取数据一次,而不是在原始 SQL 中读取数据 4 次,并且速度可能会更快。

INSERT INTO offer_data (offer_id,offer_cd,offer_brand_nm) 
WITH offer_CTE as (SELECT * FROM offer_row_data)
(SELECT distinct offer1_id, offer1_cd, offer1_brand_nm FROM offer_CTE)
UNION
(SELECT distinct offer2_id, offer2_cd, offer2_brand_nm FROM offer_CTE)
UNION
(SELECT distinct offer3_id, offer3_cd, offer3_brand_nm FROM offer_CTE)
UNION
(SELECT distinct offer4_id, offer4_cd, offer4_brand_nm FROM offer_CTE)

如果这可以解决您的性能问题,请告诉我。

关于mysql - 需要将数据从一张表加载到另一张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53391319/

相关文章:

android - 应用程序Android Json Mysql : Error in http connection android. os.NetworkOnMainThreadException

database - 数据集市规范化了吗?如果是,那么数据集市的正常形式是什么?

count - 仓库 : Store (and count) non-fact records?

python - pandas 操纵数据框形状

sql - 在 unpivot 中包含 NULL 值

sql - 使用 PIVOT 将数据从宽翻转到高

c# - Servicestack : Handle indexes, 自动递增等没有属性?

mysql - 使用多个 where 子句插入语句

php - 在 PHP 中更改来自 MySQL 的项目的顺序

database - 多次加入日期维度? - Kimball 关于数据仓库和维度建模的书