MySQL 8递归CTE为每个项目创建行

问题描述 投票:0回答:1

我想从不存在的表中创建数据返回:

+-------+--------+------------+
| type  | name   | expiration |
+-------+--------+------------+
| fruit | orange | 1999-12-31 |
| fruit | banana | 1999-12-31 |
| fruit | apple  | 1999-12-31 |
| fruit | orange | 2000-01-01 |
| fruit | banana | 2000-01-01 |
| fruit | apple  | 2000-01-01 |
+-------+--------+------------+

每个水果在同一行中有相同的日期。然后将日期增加一天,并为该日期为每个水果创建一行。

到目前为止,我有这个查询:

WITH RECURSIVE cte  
AS (
      SELECT 
          "fruit" as `type`
          ,"orange" as `name`
          ,"1999-12-31" as `expiration`
      UNION ALL
      SELECT 
          "fruit" as `type`
          ,"banana" as `name`
          ,date_add(`expiration`, INTERVAL 1 DAY) as `expiration`
      FROM cte 
      WHERE `expiration` < "2000-01-01"
    )
SELECT *
FROM cte
;

生成:

+-------+--------+------------+
| type  | name   | expiration |
+-------+--------+------------+
| fruit | orange | 1999-12-31 |
| fruit | banana | 2000-01-01 |
+-------+--------+------------+

我认为可以通过从具有水果名称但不知道如何实现的临时fruit_list表中进行递归CTE选择来解决该问题。

示例fruit_list表:

CREATE TEMPORARY TABLE IF NOT EXISTS `fruit_list` (
    `name` varchar(128) NOT NULL
) ENGINE = InnoDB;

INSERT INTO `fruit_list` VALUES
("orange")
,("banana")
,("apple")
;

我想用常规查询而不是过程来解决问题。有可能吗?

解决方案的目的是使查询能够返回每个水果和日期范围的一些测试数据。

foreach common-table-expression recursive-query mysql-8.0
1个回答
0
投票

您可以通过一系列交叉连接来处理此问题:

SELECT
    f.type,
    n.name,
    e.expiration
FROM (SELECT 'fruit' AS type) f
CROSS JOIN
(
    SELECT 'orange' AS name UNION ALL
    SELECT 'banana' UNION ALL
    SELECT 'apple'
) n
CROSS JOIN
(
    SELECT '1999-12-31' AS expiration UNION ALL
    SELECT '2000-01-01'
) e
ORDER BY
    f.type,
    e.expiration,
    n.name;

screen capture of demo

Demo

© www.soinside.com 2019 - 2024. All rights reserved.