具有不相等相关谓词的不支持的聚合子查询

Posted

技术标签:

【中文标题】具有不相等相关谓词的不支持的聚合子查询【英文标题】:Unsupported aggregate subquery with non-equality correlated predicates 【发布时间】:2020-09-12 22:28:00 【问题描述】:

我是 Impala 的新手 - 当我们加入以下两个表时,我们收到以下错误消息。 Impala 不支持相关子查询上的 >= - 任何建议我们如何做到这一点

CREATE TABLE database.test_dve (
  campo1 INT,
  campo2 TIMESTAMP,
  campo3 INT
)
STORED AS PARQUET;

insert into database.test_dve values(1,'2019-09-30',1);
insert into database.test_dve values(2,'2019-09-30',1);
insert into database.test_dve values(3,'2019-09-30',1);

CREATE TABLE database.test_dve2 (
  campo1 INT,
  campo2 TIMESTAMP
)
STORED AS PARQUET;

insert into database.test_dve2 values(1,'2019-10-30');

select *
from database.test_dve a
WHERE 0 >= (SELECT count(*) FROM database.test_dve2 b
WHERE a.campo1 = b.campo1
AND CAST(from_timestamp(a.campo2, 'yyyyMM') as INT) >= CAST(from_timestamp(b.campo2, 'yyyyMM') as INT)
);

错误信息

[HY000] [Cloudera][ImpalaODBC] (110) 在 Impala 中执行查询时出错:[HY000]:AnalysisException:不支持的聚合子查询与非等式相关谓词:CAST(from_timestamp(a.campo2, 'yyyyMM' ) AS INT) >= CAST(from_timestamp(b.campo2, 'yyyyMM') AS INT)

谢谢

【问题讨论】:

【参考方案1】:

尝试将其替换为 not exists:

select *
from database.test_dve a
WHERE NOT EXISTS (SELECT 1
                  FROM database.test_dve2 b
                  WHERE a.campo1 = b.campo1 AND
                        CAST(from_timestamp(a.campo2, 'yyyyMM') as INT) >= CAST(from_timestamp(b.campo2, 'yyyyMM') as INT)
                 );

【讨论】:

以上是关于具有不相等相关谓词的不支持的聚合子查询的主要内容,如果未能解决你的问题,请参考以下文章

如何提高其 SET 涉及昂贵的聚合子查询的 SQL UPDATE 语句的性能?

CHAR类型列上具有相等谓词的查询中没有返回数据[关闭]

SQL 查询错误(不支持具有跳过级相关性的相关子查询)

SQL Presto:不支持相关子查询

BIGQUERY:连接谓词中的表不受支持的子查询

Spring Boot REST/JPA 服务中的不相等查询