首页 > 解决方案 > 数字表的 SQL CTE 对静态值来说很快,但对表值来说很慢

问题描述

我正在尝试根据该表中的列多次输出表的值。

我尝试使用 CTE 即时制作一个数字表:

WITH cte AS
(
    SELECT
        ROW_NUMBER() OVER (ORDER BY (select 0)) AS i
    FROM
        sys.columns c1 CROSS JOIN sys.columns c2 CROSS JOIN sys.columns c3
)
select *
from myTable, cte
WHERE i <= myTable.timesToRepeatColumn
  and myTable.id = '209386'

这个 SQL 似乎需要永远运行,所以它似乎试图在加入之前运行整个 CTE。

如果我myTable.timesToRepeatColumn用静态值(比如 10000)替换,查询几乎会立即返回。因此,在完全交叉加入 CTE 表之前,它似乎在执行 where i <= 。

我如何告诉 SQL 像使用静态数字一样首先执行 where 语句?

标签: sqlsql-serverquery-optimizationcommon-table-expression

解决方案


您可以使用递归 cte 来实现您的目标

WITH cte AS (
SELECT
  *
, timesToRepeatColumn as level
FROM
    myTablewhere 
WHERE myTable.id = '209386'
UNION ALL
SELECT
  *
, level -1  as level
FROM
    cte 
WHERE 
    level > 0
)


SELECT * FROM cte

推荐阅读