Snowflake cloud data platform 雪花(左连接)横向:无法计算不支持的子查询类型

Snowflake cloud data platform 雪花(左连接)横向:无法计算不支持的子查询类型,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,在FROM子句中,横向关键字允许内嵌视图引用该内嵌视图前面的表表达式中的列 横向联接的行为更像是相关子查询,而不像大多数联接 让我们稍微调整一下文档中提供的代码: CREATE TABLE departments (department_id INTEGER, name VARCHAR); CREATE TABLE employees (employee_ID INTEGER, last_name VARCHAR, department_ID IN

在FROM子句中,横向关键字允许内嵌视图引用该内嵌视图前面的表表达式中的列

横向联接的行为更像是相关子查询,而不像大多数联接

让我们稍微调整一下文档中提供的代码:

CREATE TABLE departments (department_id INTEGER, name VARCHAR);
CREATE TABLE employees (employee_ID INTEGER, last_name VARCHAR,
                        department_ID INTEGER, project_names ARRAY);

INSERT INTO departments (department_ID, name) VALUES 
    (1, 'Engineering'), 
    (2, 'Support'),
    (3, 'HR');  -- adding new row

INSERT INTO employees (employee_ID, last_name, department_ID) VALUES 
    (101, 'Richards', 1),
    (102, 'Paulson',  1),
    (103, 'Johnson',  2);  
查询:

SELECT * 
FROM departments AS d,
LATERAL (SELECT * FROM employees AS e 
         WHERE e.department_ID = d.department_ID 
         ORDER BY employee_id DESC LIMIT 1) AS iv2  -- adding ORDER BY ... LIMIT ...
ORDER BY employee_ID;
SQL编译错误:无法计算不支持的子查询类型

是的,我知道我可以用
ROW\u NUMBER()
或其他方式重写此查询


1) 为什么在此特定场景中不可能使用
TOP/LIMIT

2) 是否有实现左连接横向/外部应用的语法

我也希望能够获取结果集中的所有源行,即使横向子查询没有为它们生成任何行。要获得最终结果:

┌────────────────┬──────────────┬──────────────┬────────────┬────────────────┬───────────────┐
│ department_id  │    name      │ employee_id  │ last_name  │ department_id  │ project_names │
├────────────────┼──────────────┼──────────────┼────────────┼────────────────┼───────────────┤
│             1  │ Engineering  │ 102          │ Paulson    │ 1              │ null          │
│             2  │ Support      │ 103          │ Johnson    │ 2              │ null          │
│             3  │ HR           │ null         │ null       │ null           │ null          │
└────────────────┴──────────────┴──────────────┴────────────┴────────────────┴───────────────┘

因此,尽管我们之前已经讨论过,您知道您可以重写它,但这里是它的重写

WITH departments AS (
    SELECT * FROM VALUES
        (1, 'Engineering'), 
        (2, 'Support'),
        (3, 'HR')
        v(department_ID, name)
), employees AS (
    SELECT * FROM VALUES 
        (101, 'Richards', 1),
        (102, 'Paulson',  1),
        (103, 'Johnson',  2)
        v(employee_ID, last_name, department_ID)
), dep_emp AS (
  SELECT * 
  FROM employees 
  QUALIFY ROW_NUMBER() OVER (PARTITION BY department_ID ORDER BY employee_id) = 1
)
SELECT * 
FROM departments AS d
LEFT JOIN dep_emp AS e ON d.department_ID = e.department_ID
ORDER BY employee_ID;
如你所愿:

DEPARTMENT_ID    NAME           EMPLOYEE_ID    LAST_NAME    DEPARTMENT_ID
1                Engineering    101            Richards     1
2                Support        103            Johnson      2
3                HR             null           null         null
通过使用QUALIFY从侧向移动到CTE以实现LIMIT/TOP,然后使用LEFT JOIN获得空匹配,您就有了所需的步骤

还有一个未被问到的问题,为什么会这样。Snowflake并不是一个真正的每行数据库,它更多的是一个映射/减少/合并连接过程,以及简单的相关子查询,它可以重写为多个步骤(又称CTE/连接),但它不能重写复杂的内容。他们一直在改进。但是,如果您知道您的数据和您的模型,那么以批量操作的方式表达内容并让MergeJoin的强大功能为您带来胜利才是最有意义的

是否有实现左连接横向/外部应用的语法? 这是通过命令中的参数
,OUTER=>TRUE
完成的


这个错误说明了问题所在,我发现其中一个会碰到很多问题,即不支持相关子查询(一般形式),有时它们会将内容重写为相关子查询。因此,你必须解决这个问题,但是在CTE和类似的东西中做更多/更大的简单事情,然后结合在一起。但正如你所注意到的,你知道如何做到这一点。因此,答案不是a,而是a,是的!欢迎来到雪花。。我通常会对it新同事说,“这不是一个DB,而是一个映射/还原,假装是一个DB,所以像它不思考DB是怎么想的一样思考”@simeonprilgrim
错误说明了问题所在,我发现问题很多,这是因为不支持相关子查询(一般形式)
->LATERAL的全部要点是处理相关的子查询/函数。这里的问题似乎是
LIMIT
子句的用法。我想知道是什么原因和/或有一个可能不受支持的功能列表。是的,我可以切换范式,我会这样做:)因为它使用SQL作为访问方法,所以我假设它是完全兼容的。我同意横向查询是一种最纯粹的相关子查询。我的学习是通过Fattern for JSON,但除此之外,它们是连接的优化。在RDB的上下文中它们是有意义的,在RDB中有索引,但考虑到snowflake是无索引的,我倾向于将Snowfalke视为并行过滤器和合并联接。在这种情况下,子查询不存在最优性。这只是我的心理模型,它帮助我克服了标准SQL模型中的缺陷,标准SQL模型主要是任何一个系统为避免昂贵的大表扫描而添加的优化。对我来说,这是一种SF模式。