Необходимо загрузить данные из одной таблицы в другую - PullRequest
0 голосов
/ 20 ноября 2018

Исходные данные строки находятся в таблице ниже -

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)

, так как у меня 25 миллионов наборов данных, так что это будет бременем производительности и ожидается более эффективное решение

Пример:

Ввод:

+--------------+-------------+-------------+-----------------+-------------+-------------+-----------------+-------------+-------------+-----------------+-------------+-------------+-----------------+
| 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    |
+-----------+-------------+-------------+----------------+

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Я бы выбрал это как простой и, возможно, самый быстрый, и он работает, если вы не используете MySQL 8.0 / MariaDB 10.2 (с CTE):

INSERT INTO offer_data (offer_id,offer_cd,offer_brand_nm) 
    SELECT offer1_id, offer1_cd, offer1_brand_nm
        FROM wide_table;
INSERT INTO offer_data (offer_id,offer_cd,offer_brand_nm) 
    SELECT offer2_id, offer2_cd, offer2_brand_nm
        FROM wide_table;
INSERT ... 3...
INSERT ... 4...

Если есть «до 4»предложения в строках, я предлагаю вам добавить это к SELECT # 2:

    WHERE offer2_id IS NOT NULL
       OR offer2_cd IS NOT NULL
       OR offer2_brand_nm IS NOT NULL

(и аналогично для других вариантов выбора).

DISTINCT замедлит процесс, но сделайте это, если вам нужно.В качестве альтернативы, используйте INSERT IGNORE и , чтобы иметь какую-то клавишу UNIQUE, готовую для ловли дуплей.

Возможно, вы захотите переосмыслить потребность в AUTO_INCREMENT на новой таблице.Возможно, один из (или комбинация) новых столбцов может быть «естественным» PRIMARY KEY?

Это также было бы хорошим временем для проверки типов данных.Возможно, вам не нужен 8-байтовый BIGINT, но вы можете использовать 4-байтовый INT или 3-байтовый MEDIUMINT.Действительно ли столбцы char(20) имеют фиксированную длину?Они utf8?VARCHAR(20) с подходящим значением CHARACTER SET может быть значительно лучше для пространства и производительность.

Как только вы загрузите таблицу, бросьте старую таблицу.Плохо практиковать распределение массива по нескольким столбцам.

0 голосов
/ 21 ноября 2018

Если вы используете CTE, он читает данные только один раз, а не 4 раза в исходном SQL, и это может быть быстрее.

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)

Пожалуйста, дайте мне знать, если это решит вашу проблему с производительностью.

...