【问题标题】:MySQL 8 Recursive CTE generate number of rowsMySQL 8 Recursive CTE 生成行数
【发布时间】:2020-03-11 14:36:39
【问题描述】:

我想使用 MySQL CTE 生成 n 随机行数。到目前为止,我有:

WITH RECURSIVE cte AS
(
    SELECT LEFT(MD5(RAND()),8) AS `three`
    UNION ALL
    SELECT LEFT(MD5(RAND()),8) AS `three`
    WHERE `rn` < 10
)
SELECT * FROM cte
;

条件的制作方法

WHERE `rn` < 10

工作,假设 rn 是递归查询返回的行号?

我知道你可以使用:

SELECT ROW_NUMBER() OVER () AS `rn`

获取行号但是如何使用呢?有没有替代方案?

我正在使用 MySQL 8。

【问题讨论】:

    标签: mysql common-table-expression recursive-query mysql-8.0


    【解决方案1】:

    您可以在 CTE 中添加一个“控制”列,从一开始计数。然后,您可以限制递归步骤以在该列中的值超过十(或任何 n 时结束)。在外部SELECT 然后只选择具有随机值的列,而不是“控制”列。

    WITH RECURSIVE cte
    AS
    (
    SELECT left(md5(rand()), 8) three,
           1 i
    UNION ALL
    SELECT left(md5(rand()), 8) three,
           i + 1 i
           FROM cte
           WHERE i + 1 <= 10
    )
    SELECT three
           FROM cte;
    

    db<>fiddle

    【讨论】:

    • i 返回深度而不是列。列可能是 100 万,但如果深度为 5,则上述查询将不起作用。
    • @Thanasis:CTE 中只有两列,整个结果中只有一列,不可能有 100 万。
    • 对不起兄弟我的错误。我的意思是行。不是列。您的实际示例测量级别深度而不是行数。您使用 Recursive 的原因之一。测量条目的子条目。如果计算中只有 1 级深度,您的代码可能会起作用。我将尝试编写一个包含多个 WITH 的查询,该查询测量每个列下的最大列。我给了你一个赞,因为即使在最初的帖子发布一年后,你也会真正监控你的帖子!另外我想提一下,从 MySQL 8.0.18 开始,您可以在第二个 RECURSIVE cte 参数中使用 LIMIT X!只是为了分享我的 2cents
    • @Thanasis:当UNIONed 查询结果为空集时,递归停止。在这种情况下,当i + 1 超过10 时会发生这种情况。 UNION 的第一个操作数 (SELECT) 是 FROMWHERE 少,因此只产生一行。
    • @Thanasis:第二个也只产生一行。 documentation 声明“递归部分的每次迭代只对前一次迭代产生的行进行操作”。在第一个递归步骤中,前一组有一行(从FROMWHERE 减去SELECT)。所以这一步产生一行,依此类推。所以生成的行数是 10,因为 i1 的值开头。
    猜你喜欢
    • 2020-02-22
    • 2018-07-08
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多