开发者社区 > 大数据与机器学习 > 大数据计算 MaxCompute > 正文

大数据计算MaxCompute中,odps left join的on条件对主表加判断影响到最终输出?

大数据计算MaxCompute中,为什么odps left join的on条件对主表加判断影响到最终输出啊?理论上应返回3条数据,实际跑完显示1条数据。
SELECT *
FROM (
SELECT 1 AS aaa
UNION ALL
SELECT 2
UNION ALL
SELECT 3
) a
LEFT JOIN (
SELECT 1 AS bbb
) b
ON a.aaa = b.bbb
AND a.aaa = 1

展开
收起
嘟嘟嘟嘟嘟嘟 2024-04-30 23:39:27 39 0
2 条回答
写回答
取消 提交回答
  • 在MaxCompute(也称为ODPS,Open Data Processing Service)中,当你使用 LEFT JOIN 时,ON 条件定义了如何连接两个表,并且它确实会影响到最终输出的结果。但是,ON 条件本身并不直接对“主表”(即 LEFT JOIN 语句中左侧的表)进行筛选或判断。

    LEFT JOIN 的基本工作原理是:它会返回左表中的所有记录,以及与右表匹配的记录。如果右表中没有匹配的记录,则结果集中对应右表的列将为NULL。

    当你在 ON 条件中添加了对主表的判断时,这实际上是在定义如何连接两个表,而不是对主表进行筛选。但是,如果这种判断使得某些左表的记录不能与右表的任何记录匹配,那么这些左表的记录仍然会出现在结果集中,但对应的右表列的值将为NULL。

    例如,考虑以下SQL查询:

    sql
    SELECT *
    FROM table1 t1
    LEFT JOIN table2 t2 ON t1.key = t2.key AND t1.value > 100;
    在这个例子中,ON 条件不仅要求 t1.key 和 t2.key 相等,还要求 t1.value 大于100。但是,这个 t1.value > 100 的条件并不会从 table1 中移除任何记录。它只是决定了哪些 table1 的记录会与 table2 的记录匹配。如果 table1 中的某个记录的 value 不大于100,那么它仍然会出现在结果集中,但与之对应的 table2 的列的值将为NULL。

    如果你想要对主表进行筛选,你应该在 WHERE 子句中进行,而不是在 ON 子句中。但是请注意,WHERE 子句是在连接操作之后应用的,所以它可能会移除那些在 LEFT JOIN 之后原本为NULL的右表列的记录。这可能会导致你失去 LEFT JOIN 的原始意图,即保留左表中的所有记录。

    2024-05-01 08:57:05
    赞同 1 展开评论 打赏
  • 是三条数据呢,应该是版本问题。
    d871f18587479e4593424dcf9151eb0d.png
    此回答整理自钉群“MaxCompute开发者社区1群”

    2024-05-01 08:54:50
    赞同 1 展开评论 打赏

MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。

相关产品

  • 云原生大数据计算服务 MaxCompute
  • 相关电子书

    更多
    大数据AI一体化的解读 立即下载
    极氪大数据 Serverless 应用实践 立即下载
    大数据&AI实战派 第2期 立即下载