MySQL L oop внутри L oop для транспонирования записей - PullRequest
1 голос
/ 28 мая 2020

У меня есть таблица доставки с полями (id, количество, productId, customerId, deliveryDate). Существует требование размещать сериализованную бирку на каждом продукте и вести журнал с указанием бирки, продукта, клиента и даты доставки. Таблица tagLog увеличивается автоматически, а идентификатор представляет собой серийный номер тега

Delivery Table
id    quantity   productId     customerId     deliveryDate 
2085     4        10197          245          2020-06-05
2085     2        10433          245          2020-06-05

Я хочу l oop через таблицу доставки (где еще не отмечены теги) и для каждой строки создать отдельную запись в tagLog для числа в поле количества. Например, эти две записи доставки должны создать 6 записей в таблице tagLog.

tagLog
tagId      productId     customerId    deliveryDate
20890        10197           245        2020-06-05
20891        10197           245        2020-06-05
20892        10197           245        2020-06-05
20893        10197           245        2020-06-05
20894        10433           245        2020-06-05
20895        10433           245        2020-06-05

Любые советы по построению внутреннего l oop будут оценены.

1 Ответ

0 голосов
/ 28 мая 2020

SQL - это язык на основе набора , который неэффективен при обработке циклов.

Если вы используете MySQL 8.0, вы можете сделать это с помощью рекурсивного запроса (это все еще итеративный процесс, но с большей производительностью, чем al oop в хранимой процедуре):

with recursive cte as (
    select id, productId, customerId, deliveryDate, quantity 
    from delivery
    union all 
    select id, productId, customerId, deliveryDate, quantity - 1
    from cte
    where quantity > 0
)
select 
    row_number() over(order by id) tagId,
    productId,
    customerId,
    deliveryDate 
from cte

Неясно, какой метод вы хотите использовать для генерации tagId. Это дает вам постоянно увеличивающийся номер, который начинается с 1, и где записи одного и того же оригинала id являются последовательными.

...