配置单元查询不允许在where子句的子查询中使用>=

eqzww0vc  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(328)

我有一个生成日期的表(umt\u date),我需要在第二个查询中使用这个日期来获取大于等于umt\u date表中日期的所有数据

umt_date
----------------------------
|processdate||processname|
----------------------------
| 2020-06-01 | A         |
----------------------------
| 2020-06-01 | B         |

当我执行sql时

select * from main_table
where processdate >= (select processdate from umt_date where processname='A')

我得到以下错误
sql错误[40000][42000]:编译语句时出错:失败:semanticexception行0:-1不支持的子查询表达式“processdate”:只允许作为顶级连接的子查询表达式
因为我们没有任何公共列,所以也不能执行连接。还有什么办法?

gmxoilav

gmxoilav1#

你可以试着用 WITH 下面这样的条款

WITH PROCESSA_SUBQ AS(
   select processdate from umt_date where processname='A'
 )
 SELECT a.* FROM main_table as a
 INNER JOIN
 PROCESSA_SUBQ as b
 ON 1=1    -- always true join condition, can be ignored.
 where a.processdate >= b.processdate

或者你也可以得到一个布尔条件检查:

WITH PROCESSA_SUBQ AS(
   select processdate from umt_date where processname='A'
 )
 SELECT X.* FROM (
 SELECT a.*, (a.processdate>=b.processdate) as check FROM main_table as a
 INNER JOIN
 PROCESSA_SUBQ as b
 ON 1=1  -- always true join condition, can be ignored.
 ) as X where X.check = true
rkue9o1l

rkue9o1l2#

如果子查询返回单行,请使用交叉联接:

select m.* 
     from main_table m
          cross join (select processdate from umt_date where processname='A') t
where m.processdate >= t.processdate

如果子查询返回多行,则在某些条件下使用join。交叉连接在这种情况下并不好,因为它会复制数据,尽管where可能会过滤重复的行

相关问题