我想从不存在的表中创建数据返回:
+-------+--------+------------+
| 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")
;
我想用常规查询而不是过程来解决问题。有可能吗?
解决方案的目的是使查询能够返回每个水果和日期范围的一些测试数据。
您可以通过一系列交叉连接来处理此问题:
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;