CTE 的 CROSS JOINing 和 CROSS JOINing TRANSIENT TABLES 之间的不同输出

Different outputs between CROSS JOINing of CTE and CROSS JOINing TRANSIENT TABLES

(代表 Snowflake 用户提交问题)


我在使用 CTE 和 CROSS JOINS 时得到不正确的输出。

但是在创建 TRANSIENT TABLES 而不是 CTE 时正确的输出:

罪魁祸首是 CLASS CTE

WITH
vennDimension AS
(
  SELECT ROW_NUMBER() OVER (ORDER BY 1) -1 AS TIMEPERIOD
         FROM TABLE(GENERATOR(ROWCOUNT => 2+1))
  ),
nonVennDimension AS
(
  SELECT ROW_NUMBER() OVER (ORDER BY 1) AS PRODUCT
         FROM TABLE(GENERATOR(ROWCOUNT => 2+1))
  ),
class AS
(
  SELECT *, CASE WHEN MOD(CLASS, 2) >= 1 THEN 1 ELSE 0 END AS Venn_Group1 , 
CASE WHEN MOD(CLASS, 4) >= 2 THEN 1 ELSE 0 END AS Venn_Group2 
     FROM
      (SELECT ROW_NUMBER() OVER (ORDER BY 1) AS CLASS FROM TABLE(GENERATOR(ROWCOUNT => 3 ))        )b
  ),
view_type AS
(
  SELECT * FROM VALUES (1),(2) AS tmp(view_type)
)
SELECT * FROM class
cross join (
SELECT  * FROM (
   SELECT *  FROM
   vennDimension v  --all venn groups plus total
          CROSS JOIN nonVennDimension nv--secondary groups
) a
CROSS JOIN (SELECT * FROM view_type) c
) a
WHERE PRODUCT=1 AND TIMEPERIOD=0
;

这是正确的输出:

CREATE TRANSIENT TABLE 
vennDimension_table AS
(
  SELECT ROW_NUMBER() OVER (ORDER BY 1) -1 AS TIMEPERIOD
         FROM TABLE(GENERATOR(ROWCOUNT => 2+1))
  )
  ;

CREATE TRANSIENT TABLE 
nonVennDimension_table AS
(
  SELECT ROW_NUMBER() OVER (ORDER BY 1) AS PRODUCT
         FROM TABLE(GENERATOR(ROWCOUNT => 2+1))
  )
 ;

CREATE TRANSIENT TABLE 
class_table AS
(
  SELECT *, CASE WHEN MOD(CLASS, 2) >= 1 THEN 1 ELSE 0 END AS Venn_Group1 , 
CASE WHEN MOD(CLASS, 4) >= 2 THEN 1 ELSE 0 END AS Venn_Group2 
     FROM
      (SELECT ROW_NUMBER() OVER (ORDER BY 1) AS CLASS FROM TABLE(GENERATOR(ROWCOUNT => 3 ))        )b
  );

CREATE TRANSIENT TABLE 
view_type_table AS
(
  SELECT * FROM VALUES (1),(2) AS tmp(view_type)
)
;

SELECT * FROM  class_table a
CROSS JOIN view_type_table b
CROSS JOIN nonvenndimension_table c
CROSS JOIN venndimension_table d
WHERE PRODUCT = 1 AND TIMEPERIOD=0
;

我做错了什么?有什么想法、建议等吗?

看来您发现了一个错误,除非我们在 window 函数的文档中遗漏了一些很好的文字。

问题出在 class CTE 中的 (ORDER BY 1)。如果您将 1 更改为任何其他常量,例如 0,它会起作用。去图吧!