ODPS JOIN

作者: youyuge | 来源:发表于2020-04-21 22:02 被阅读0次

阿里云中Max Compute(原ODPS)计算引擎学习备忘录。

子查询

子查询等价:https://help.aliyun.com/document_detail/73781.html?spm=a2c4g.11186623.6.695.bfdd28dc5TaSoL#title-kho-mt6-6rm
以下in语句只在ODPS2中生效。但是可以清楚地看到semi join与anti join的含义。

Semi join: 只留下右表中id出现的行

类似交集 union

LEFT SEMI Join的处理逻辑是对于左表的每一条记录,都去和右表进行匹配,如果匹配成功,则输出左表。这里需要注意的是由于只输出左表,所以JOIN后的Where条件中不能写右侧的过滤条件。LEFT SEMI JOIN常用来实现exists的语义。

select * from mytable1 where id in (select id from mytable2);
--等效于以下语句。
select * from mytable1 a left semi join mytable2 b on a.id = b.id;

Anti join:过滤去掉右表中id出现的行

类似补集 except / minus

LEFT ANTI Join的处理逻辑是对于左表的每一条记录,都去和右表进行匹配,如果右表所有的记录都没有匹配成功,则输出左表。同样由于只输出左表,所以JOIN后的Where条件中不能写右侧的过滤条件。LEFT SEMI JOIN常常用来实现not exists的语义。

select * from mytable1 where id not in (select id from mytable2);
--如果mytable2中的所有id都不为NULL,则等效于以下语句。
select * from mytable1 a left anti join mytable2 b on a.id = b.id;

JOIN

详细语法说明:https://help.aliyun.com/document_detail/73783.html?spm=a2c4g.11186623.2.11.66bd7eb5iuC82y#title-6wq-wbn-brl

MaxCompute的JOIN操作分为左连接、右连接、全连接、内连接。以下四种命令中的outer / inner都可以省略。

  • Left Outer Join:左连接。返回左表中的所有记录,即使右表中没有与之匹配的记录。如果右表中没有匹配,则结果为 NULL。
    Left Join的处理逻辑是将左右表进行笛卡尔乘积,然后对于满足ON表达式的行进行输出,对于左表中不满足ON表达式的行,输出左表,右表补NULL。
    https://www.runoob.com/sql/sql-join-left.html

说明 如果右边值不唯一,建议不要连续使用过多left join,以免在join的过程中产生数据膨胀,导致作业停滞。因为若右表中有N行对应,则结果表中会生成N行。若无对应,则会填null。

  • Right Outer Join:右连接。返回右表中的所有记录,即使左表中没有与之匹配的记录。

  • Full Outer Join:全连接。返回左右表中的所有记录。
    FULL Join的处理逻辑是将左右表进行笛卡尔乘积,然后对于满足ON表达式的行进行输出,对于两侧表中不满足ON表达式的行,输出有数据的表,另一侧补NULL。

  • Inner Join:内连接,关键字inner可以省略。表中存在至少一个匹配时,inner join返回行。
    Inner Join的处理逻辑是将左右表进行笛卡尔乘积,然后选择满足ON表达式的行进行输出。
    https://www.runoob.com/sql/sql-join-inner.html

JOIN ON条件与where条件与子查询中的where条件辨析

https://help.aliyun.com/document_detail/89993.html

相关文章

网友评论

      本文标题:ODPS JOIN

      本文链接:https://www.haomeiwen.com/subject/qlwwbhtx.html