SQL группировка, создание дублей
Добрый день, подскажите , могу ли я с помощью MYSQL 5.7 из двух записей сделать 8 то есть мне нужно продублировать записи и сделать к примеру с первой строки
H067 S070
2 01
2 03
2 #
2 05
на скрине это результат выборки который мне нужно еще отработать
UPDATE вот набросал чтото примерное
DROP TABLE IF EXISTS new_table;
CREATE TABLE IF NOT EXISTS new_table (
id int AUTO_INCREMENT,
name varchar(255),
date_start DATE NULL,
date_operation DATE NULL,
date_return DATE NULL,
params_1 int,
params_2 int,
params_3 int,
PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci`;
INSERT INTO new_table (name, date_start, date_operation, date_return, params_1, params_2, params_3)
VALUES ('название_1', '2023-01-01', '2023-01-05', '2023-05-05', 1, 1, 0),
('название_2', '2023-05-01', '2023-08-05', null, 1, 1, 0),
('название_3', '2023-06-01', '2023-09-05', '2023-05-05', 1, 1, 0),
('название_4', '2023-07-01', '2023-10-05', '2023-05-05', 1, 1, 0),
('название_5', '2023-08-01', '2023-11-05', null, 1, 1, 0),
('название_6', '2023-09-01', '2023-12-05', '2023-05-05', 1, 1, 0),
('название_7', '2023-10-01', '2024-01-05', null, 1, 1, 0),
('название_8', '2023-11-01', '2021-02-05', '2023-05-05', 1, 1, 0);
select
t1.id,
t1.H067,
CASE WHEN params_1 = 1 AND date_return is NULL THEN '01' ELSE '#' END as 'S070_01',
CASE WHEN params_2 = 1 AND date_operation is NOT NULL THEN '03' ELSE '#' END as 'S070_03',
CASE WHEN params_3 = 1 AND params_2 = 1 THEN '04' ELSE '#' END as 'S070_04'
from (
select *,
'1' as 'H067'
from new_table
where date_start > '2023-09-01'
UNION ALL
select *,
'2' as 'H067'
from new_table
where date_operation > '2023-07-01' and date_operation < '2023-12-31'
UNION ALL
select *,
'3' as 'H067'
from new_table
where date_return is null
) as t1
по итогу мне нужно 2 столбца H067 S070 только чтобы H067 имел все условия
нюансы что new_table имеет несколько милионов записей и джоитится также к много милионным записям
Ответы (1 шт):
Шаблон для дублирования записей в таблице:
INSERT INTO tablename ( {список полей без поля автоинкремента} )
SELECT {список полей без поля автоинкремента}
FROM tablename
CROSS JOIN (SELECT 1 UNION SELECT 2 UNION .. SELECT N) numbers
WHERE {дополнительные условия}
N - максимальное количество создаваемых копий.
Дополнительные условия могут ограничивать количество копий отдельных записей.
В списке выходного набора SELECT-части можно модифицировать вставляемые значения.
Если первичный ключ - не автоинкремент, следует в списке вывода SELECT формировать уникальное значение для ПК соотв. выражением.
Если количество нужных копий велико, можно CROSSJOIN-ить несколько синтетических таблиц. Также вместо синтетической таблицы чисел можно использовать рекурсивный CTE. Но не в случае MySQL 5.x, который их не поддерживает.