例如,如果我创建两个简单的表,并通过逗号或交叉连接将它们连接起来,我看不到的区别
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
(如果可以的话,选择一个显式联接(