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

在sql 里嵌套查询时,查询条件带有instr时报错

在sql 里嵌套查询时,查询条件带有instr时报错,
例子如下

select
(select sapi_no from sapi_data where instr(t.url,sapi_endpoint)>0) as num
from operation_sapilog_details t;

报错

FAILED: ODPS-0130071:[2,38] Semantic analysis exception - using non-equal correlated condition should require another valid equal condition

但是如果时如下sql ,则成功
select
(select count(*)from sapi_data where t.url=sapi_endpoint) as num
from operation_sapilog_details t;

是否instr函数有使用限制?

展开
收起
1200626139224534 2023-11-16 11:54:31 210 0
7 条回答
写回答
取消 提交回答
  • 在 MaxCompute 中,当使用嵌套查询时,存在一些限制和最佳实践。你遇到的错误是因为 MaxCompute 的 SQL 解析器需要一个额外的有效等值条件来处理非等值关联条件(如 instr 函数)。这是因为 MaxCompute 使用 MapReduce 模型进行计算,在处理复杂的关联查询时可能会导致性能问题。

    2023-11-30 23:02:50
    赞同 展开评论 打赏
  • 是的,你在SQL中使用INSTR函数时需要注意一些问题。

    ODPS(Open Data Processing Service)是阿里巴巴提供的一种大数据计算服务,它兼容了SQL的大部分语法,但是在某些情况下有一些特殊的限制。

    在你的第一个SQL语句中,你使用了INSTR函数作为查询条件的条件,这在ODPS中是不被允许的。ODPS要求在关联子查询中使用INSTR函数时,必须同时满足以下条件:

    1. 子查询必须返回一个唯一的值。
    2. 子查询必须有一个等于条件与父查询关联。

    你的第二个SQL语句满足了这两个条件,所以可以正常运行。

    如果你的数据满足这些条件,你可以尝试修改你的SQL语句,使其满足ODPS的语法要求。例如,你可以先将INSTR函数的结果作为一个新的字段添加到sapi_data表中,然后再进行关联查询。

    2023-11-29 17:21:33
    赞同 展开评论 打赏
  • 根据您的描述和示例,问题可能出在instr函数的使用上。在ODPS中,当在子查询中使用instr函数时,可能会导致错误"FAILED: ODPS-0130071:[2,38] Semantic analysis exception - using non-equal correlated condition should require another valid equal condition"。

    这是因为ODPS要求在使用非等值关联条件(如instr)时,还需要提供一个有效的等值关联条件。在这种情况下,您可以尝试将查询改写为包含等值关联条件的形式,以避免此错误。

    虽然您提供的第二个示例没有使用instr函数,但它满足了ODPS的要求,因为它使用了等值关联条件t.url=sapi_endpoint

    2023-11-16 21:31:15
    赞同 展开评论 打赏
  • 你所描述的错误可能是由于instr()函数的使用方式不正确引起的。instr()函数用于返回子串在字符串中首次出现的位置,如果不存在则返回0。

    对于你的例子,你需要确保t.urlsapi_endpoint都是字符串类型,并且sapi_endpointt.url的一部分。另外,instr()函数的第三个参数是你想开始搜索的位置,默认为1,表示从第一位开始搜索。

    以下是修复后的查询:

    SELECT (SELECT sapi_no FROM sapi_data WHERE INSTR(t.url, sapi_endpoint) > 0) AS num 
    FROM operation_sapilog_details t;
    

    具体使用可参考:https://help.aliyun.com/zh/maxcompute/user-guide/instr?spm=a2c4g.11174283.0.i16
    image.png

    2023-11-16 16:07:41
    赞同 展开评论 打赏
  • 是的,instr函数在某些情况下可能会受到限制。在嵌套查询中,当使用instr函数时,需要确保查询条件是有效的等价条件。在你的例子中,你可以尝试将instr函数替换为其他字符串比较函数,例如like或position。

    例如,你可以将你的查询修改为:

    select
    (select sapi_no from sapi_data where t.url like CONCAT('%', sapi_endpoint, '%')) as num
    from operation_sapilog_details t;
    

    或者:

    select
    (select count(*) from sapi_data where t.url = sapi_endpoint) as num
    from operation_sapilog_details t;
    
    2023-11-16 15:10:43
    赞同 展开评论 打赏
  • 看这个异常提示,翻译成中文的意思是 语义分析异常:当使用非等值相关条件时,需要另外提供一个有效的等值条件。
    在语义分析的时候程序不能确定 sapi_data和operation_sapilog_details如何去关联,需要一个等值的条件去确定关联关系,这和instr是没有关系的,你可以加上一个等值条件试试

    2023-11-16 14:51:29
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    是的,对于关联查询来说,在ODPS SQL中确实有一些限制。从您的描述来看,似乎是由于使用了instr函数导致的。在ODPS SQL中,如果使用非等值关联条件(如>、<、like、instr等),则需要提供一个有效的等值关联条件。

    在这种情况下,您可以考虑改用其他方法来实现相同的功能。例如,您可以先将sapi_endpoint添加到operation_sapilog_details表中作为列,然后在外部查询中直接比较这两个列,这样就可以避免关联查询的限制。

    2023-11-16 12:45:36
    赞同 展开评论 打赏
滑动查看更多

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

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载