sql - 数字表的 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 语句?
解决方案
您可以使用递归 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
推荐阅读
- python - 如何将数据加载到 excel 模板到特定的工作表名称中
- bash - 如何遍历命令输出的bash中的行?
- javascript - 用js填充表格时,标签a没有给出想要的结果
- macos - Where does MacOS Audio MID Setup save the aggregated devices configuration file?
- ios - 如何使视图控制器仅在用户第一次快速打开应用程序时出现
- spring - HazelCast 我无法从缓存中获取数据
- d3.js - 与D3的数据关系图
- boto3 - 尝试使用 aws-cdk 向 s3 日志交付组授予完整权限
- r - 如何在 R 中合并多个 netcdf 文件并打开它 Arc Map?
- vue.js - 如何将数据“加载”到 Vue 组件中?