【问题标题】:MySQL Loop within a Loop to Transpose records循环内的 MySQL 循环以转置记录
【发布时间】:2020-09-15 01:48:03
【问题描述】:

我有一个包含字段(id、数量、productId、customerId、deliveryDate)的交货表。需要在每个产品上放置一个序列化标签,并维护标签、产品、客户和交货日期的日志。 tagLog表是自增的,id代表标签序号

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

我想遍历交付表(尚未标记的地方),并为每一行在 tagLog 中为数量字段中的数字创建一个单独的记录。比如这两条Delivery记录应该在tagLog表中创建6条记录。

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

任何关于内部循环构造的建议都将不胜感激。

【问题讨论】:

标签: mysql sql loops transpose recursive-query


【解决方案1】:

SQL 是一种基于集合的语言,在处理循环方面效率不高。

如果您运行的是 MySQL 8.0,则可以使用递归查询来执行此操作(这仍然是一个迭代过程,但比存储过程中的循环具有更好的性能):

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 的记录是连续的。

【讨论】:

  • 我希望使用自动增量来序列化标签。我可能会遇到有缺陷的标签等问题,但我可以在这些情况下进行编辑。感谢您对此的帮助。
猜你喜欢
  • 2012-12-30
  • 1970-01-01
  • 2015-12-20
  • 2015-07-02
  • 2012-12-22
  • 2014-06-18
  • 2021-12-28
相关资源
最近更新 更多