不确定我是否理解使用逗号和表(..)的Snowflake FROM语法



例如,如果我创建两个简单的表,并通过逗号或交叉连接将它们连接起来,我看不到的区别

CREATE TABLE T1(C1A     STRING NOT NULL
,C1B     STRING NOT NULL
);


CREATE TABLE T2(C2A     STRING NULL
,C2B     STRING NULL
);

INSERT INTO T1(C1A, C1B) VALUES('1', 'One'), (2, 'Two');
INSERT INTO T2(C2A, C2B) VALUES(NULL, 'Alpha'), (2, 'Beta'), (3, 'toto');
SELECT * FROM T1, T2; -- pretty much a cross join?
SELECT * FROM T1 CROSS JOIN T2; 

我看不出最后两次查询之间的区别

现在,我们如何解释Snowflake示例中的语法?

我们创建了一个带有变体列的表,并在其中加载一些JSON数据

CREATE TABLE "PUBLIC"."NESTED_INGEST_JSON" ( "RAW_NESTED_BOOK" VARIANT );

我不太理解下面查询的语法。。。

SELECT value
FROM NESTED_INGEST_JSON
,table(flatten(RAW_NESTED_BOOK:authors));

我知道FLATTEN((是一个为基表中的每一行返回几行的表函数,但我仍然对"和关联表(压平(…((

我在文档中找到的最接近的解释是关于LATERAL命令。。。

在我前面的例子中,我可以使用如下的逗号语法检索看起来像INNER JOIN的东西

SELECT * 
FROM T1
, LATERAL ( SELECT * FROM T2 WHERE T2.C2A = T1.C1A );

我也可以使用这种语法

SELECT * 
FROM T1, T2
WHERE T2.C2A = T1.C1A;

其行为类似于内部连接

但我仍然对的语法感到困惑

SELECT value
FROM NESTED_INGEST_JSON
,table(flatten(RAW_NESTED_BOOK:authors));

将注释复制到要关闭的答案(如果Gordon回来,我会删除这个(:

  • 在SQL中,,等价于CROSS JOIN

这是ANSI-89与ANSI-92。https://stackoverflow.com/a/3918601/132438

(如果可以的话,选择一个显式联接(

相关内容

  • 没有找到相关文章

最新更新