繁体   English   中英

在雪花中用“LEVEL”重写查询

[英]Rewrite a query with "LEVEL" in snowflake

如何将此 SQL 查询写入 SNOWFLAKE?

从 DUAL CONNECT BY LEVEL <= 3 中选择 LEVEL lv;

您可以使用 CONNECT BY ( https://docs.snowflake.com/en/sql-reference/constructs/connect-by.html ) 和此处 ( https://docs.snowflake.com/en ) 找到一些好的起点/user-guide/queries-hierarchical.html )。

Snowflake 还支持递归 CTE。

似乎您想将行复制三次。 对于固定的小乘数,例如 3,您可以只枚举数字:

select c.lv, a.*
from abc a
cross join (select 1 lv union all select 2 union all select 3) c

一种更通用的方法,本着原始查询的精神,使用标准递归公共表表达式来生成数字:

with cte as (
    select 1 lv
    union all select lv + 1 from cte where lv <= 3
)
select c.lv, a.*
from abc a
cross join cte c 

雪花有层次 与 Oracle 的区别在于:

  • 在雪花中,必须使用表达式连接
  • 而且您不能只选择级别 - 选择语句中应该有任何现有列。

例子:

SELECT LEVEL, dummy FROM 
    (select 'X' dummy ) DUAL 
CONNECT BY prior LEVEL <= 3;

LEVEL   DUMMY
1   X
2   X
3   X
4   X

根据@Danil Suhomlinov 的帖子,我们可以进一步简化使用 COLUMN1 处理特殊表双单列:

SELECT LEVEL, column1 FROM dual CONNECT BY prior LEVEL <= 3; 水平 | COLUMN1 ------+-------- 1 |
2 |
3 |
4 |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM