Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 配置单元查询不允许>;=在where子句的子查询中_Sql_Hive_Subquery_Hiveql - Fatal编程技术网

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

Sql 配置单元查询不允许>;=在where子句的子查询中,sql,hive,subquery,hiveql,Sql,Hive,Subquery,Hiveql,我有一个生成日期的表(umt_date),我需要在第二个查询中使用该日期来获取大于等于umt_date表中日期的所有数据 umt_date ---------------------------- |processdate||processname| ---------------------------- | 2020-06-01 | A | ---------------------------- | 2020-06-01 | B | 当我执行sql时 s

我有一个生成日期的表(umt_date),我需要在第二个查询中使用该日期来获取大于等于umt_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]:编译语句时出错:失败:语义异常行0:-1不支持的子查询表达式“processdate”:只允许作为顶级连接的子查询表达式


因为我们没有任何公共列,所以也不能执行联接。这有什么选择?

您可以尝试将
与下面的
子句一起使用

 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

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

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

如果子查询返回多行,则在某些条件下使用join。在这种情况下,交叉联接不好,因为它会复制数据,但何处可以筛选重复的行

您使用的配置单元版本?无条件的内部联接是交叉联接。但由于processdate只返回一行,所以这并不重要。您确实在进行交叉连接,这样就不会那么混乱了。好了。添加了连接条件。我检查了硬编码日期与交叉连接的查询性能,交叉连接比普通连接耗时3倍。因此,交叉连接引入了一个性能问题。我检查了硬编码日期与交叉连接的查询性能,并且交叉连接比正常连接花费的时间多3倍。因此,交叉连接引入了性能issue@DhirajTayade对确实如此。这是预料之中的,对吗?因为硬编码的日期查询只扫描一个表。根本不加入。您可以使用shell执行子查询以获取日期,并将该日期作为参数传递给第二个查询。使用hivevars也没有帮助,因为Hive在替换之前不计算变量。@DhirajTayade是的,您不能在同一脚本中执行此操作。使用shell。使用一个配置单元脚本计算日期并将其传递给另一个配置单元脚本