【发布时间】:2021-12-23 04:17:35
【问题描述】:
考虑以下观点和 CTE:
CREATE OR REPLACE VIEW SubSet (Id)
AS (
SELECT '123'
UNION ALL SELECT '456'
UNION ALL SELECT 'x'
)
CREATE OR REPLACE VIEW MainSet (Id)
AS (
SELECT 123
UNION ALL SELECT 456
UNION ALL SELECT 789
)
WITH myCte (id, cnt) AS
(
SELECT id, 1 AS cnt FROM SubSet
UNION ALL
SELECT id
,cnt + 1 FROM myCte WHERE cnt < 4 AND id <> 'x'
)
SELECT *
FROM MainSet ms
JOIN (
SELECT id FROM myCte WHERE id <> 'x'
) X ON ms.id = X.id
请注意,“x”在 CTE 的递归部分和 CTE 的子查询中都被过滤掉了。
这昨天奏效了。但截至今天,它以“无法识别数值'x'”失败。
如果我删除递归部分,它不会失败:
WITH myCte (id, cnt) AS
(
SELECT id, 1 AS cnt FROM SubSet
--UNION ALL
--SELECT id
--,cnt + 1 FROM myCte WHERE cnt < 4 AND id <> 'x'
)
SELECT *
FROM MainSet ms
JOIN (
SELECT id FROM myCte WHERE id <> 'x'
) mc ON ms.id = mc.id
查询被过滤后如何匹配“x”?它似乎只在使用递归 CTE 时适用。
【问题讨论】:
-
不知道为什么有一天你会失败,但我可以说递归种子(你的 myCte 定义中最顶层的查询)应该包含过滤器,否则
x会去显示在您的结果中。就您而言,它不应该出现在子查询的过滤器中,但肯定会出现在myCte的输出中。 -
你是对的。但是我最初的 CTE 更复杂,并且我没有递归种子中的“x”值。
标签: snowflake-cloud-data-platform common-table-expression