Sql 配置单元查询不允许>;=在where子句的子查询中
我有一个生成日期的表(umt_date),我需要在第二个查询中使用该日期来获取大于等于umt_date表中日期的所有数据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
----------------------------
|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。使用一个配置单元脚本计算日期并将其传递给另一个配置单元脚本