【问题标题】:Permitted Sub-queries in SnowflakeSnowflake 中允许的子查询
【发布时间】:2020-11-03 11:58:33
【问题描述】:

在 Snowflake 文档中,它列出了 Types Supported by Snowflake 支持的子查询类型:

  • 在任何可以使用值表达式的地方出现不相关的标量子查询。
  • WHERE 子句中的相关标量子查询。
  • WHERE 子句中的 EXISTS、ANY / ALL 和 IN 子查询。这些 子查询可以是相关的或不相关的。

然而,在关于windows functions 的文档中(作为一个例子)它给出了这个运行没有错误的 SQL:

select branch_id,
       net_profit as store_profit,
       (select sum(net_profit) from store_sales as s2 where s2.city = s1.city) as city_profit,
       store_profit / city_profit * 100 as store_percentage_of_city_profit
    from store_sales as s1
    order by branch_id;

据我了解:

  • city_profit 由子查询定义,并且该子查询是相关的(它引用 S1)
  • 关于允许的子查询的 3 条规则中的任何一条都不包含它(它不是不相关的,它不在 WHERE 子句中,也不是“WHERE 子句中的 EXISTS、ANY / ALL 和 IN 子查询”

因此,查询应该是无效的,但事实并非如此,我显然遗漏了一些东西。我误会了什么?

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    相关子查询对于任何 SQL 数据库都是一个复杂的主题。话虽如此,您应该不会惊讶地发现 Snowflake 不断改进其对相关子查询的支持。

    查看这些文档,他们从未说过禁止 SELECT 级别的相关子查询 - 实际上 Snowflake 可以运行示例中的查询。

    如果您发现无法与相关子查询一起运行的查询,请将可重现的示例带到 Stack Overflow — 我们将共同寻找解决方案

    【讨论】:

    • 嗨 - 感谢您的回复。但是,您的陈述“他们从不说禁止 SELECT 级别的相关子查询”是不正确的,因为这正是文档所述。它只给出了允许子查询的 3 种情况;第 2 和第 3 场景仅适用于 WHERE 子句,第 1 场景明确包括不相关的子查询。还是我错过了什么?我很高兴 Snowflake 继续改进,但在这一领域的文档似乎没有跟上。
    • 我会说这是一个“允许的事情的不完整列表”(这并不意味着你看不到的东西是不允许的)
    • 所以您同意文档不正确/不完整?
    • 在堆栈溢出方面:对原始问题的满意答案是什么?
    • 嗨 - 最好知道 Snowflake 中允许/不允许哪些类型的子查询。显然不在 Stack Overflow 的范围内,但如果有某种方式可以促使 Snowflake 文档团队更新他们的文档,那么这也会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    相关资源
    最近更新 更多