【问题标题】:Using OR on hive ParseException在 hive ParseException 上使用 OR
【发布时间】:2020-12-26 12:21:30
【问题描述】:

所以我正在尝试将 ddl 从 odi(oracle 数据集成)转移到 hive。

代码如下所示:

(308 row of code, there are fppnonday, dtddyr subquery before )
...
LEFT OUTER JOIN 
  (SELECT * FROM dffo
    WHERE 1 = 1 
    AND dffo.date = '20100909')dffot 
ON fppnonday.B_ACCT = dffot.B_CODE
where ( from_unixtime(unix_timestamp(dffot.START_DATE,'yyyyMMdd')) <= dtddyr.FULL_DATE
AND from_unixtime(unix_timestamp(dffot.END_DATE,'yyyyMMdd')) <= dtddyr.FULL_DATE
AND (dffot.C_CODE = '000' OR dffot.NAG = 'Y'))

LEFT OUTER JOIN 
  (SELECT * FROM  dflagw
    WHERE 1 = 1 
    AND dflagw.date = '20100909')dflagwr
ON fppnonday.CUER = dflagwr.CER
AND from_unixtime(unix_timestamp(dflagwr.START_DATE,'yyyyMMdd')) <= dtddyr.FULL_DATE
AND from_unixtime(unix_timestamp(dflagwr.END_DATE, 'yyyyMMdd')) > dtddyr.FULL_DATE
;

当我运行所有查询时,会发生错误: ParseException: Missing EOF at LEFT near ')' 它指的是 2nd LEFT OUTER JOIN

出了什么问题?如何有效高效地使用OR?

任何想法/帮助都会受到赞赏!

【问题讨论】:

  • 1. LEFT JOIN -&gt; WHERE -&gt; LEFT JOIN => LEFT JOIN -&gt; LEFT JOIN -&gt; WHERE 2. 访问外部表的 WHERE 条件(如 dfot.C_CODE = '000')使其成为 INNER JOIN
  • 对不起,我不明白,卢卡斯。
  • 查询有一个订单SELECT FROM LEFT JOIN LEFT JOIN WHERE,在你的查询中有SELECT FROM LEFT JOIN WHERE LEFT JOIN,这是不正确的语法

标签: oracle join hiveql


【解决方案1】:

您可以使用AND 代替WHERE,这样您就可以将这些条件组合成ON 条件:

LEFT OUTER JOIN 
  (SELECT * FROM dffo
    WHERE 1 = 1 
    AND dffo.date = '20100909')dffot 
ON (fppnonday.B_ACCT = dffot.B_CODE)
AND ( from_unixtime(unix_timestamp(dffot.START_DATE,'yyyyMMdd')) <= dtddyr.FULL_DATE
AND from_unixtime(unix_timestamp(dffot.END_DATE,'yyyyMMdd')) <= dtddyr.FULL_DATE
AND (dffot.C_CODE = '000' OR dffot.NAG = 'Y'))

LEFT OUTER JOIN 
  (SELECT * FROM  dflagw
    WHERE 1 = 1 
    AND dflagw.date = '20100909')dflagwr
ON fppnonday.CUER = dflagwr.CER
AND from_unixtime(unix_timestamp(dflagwr.START_DATE,'yyyyMMdd')) <= dtddyr.FULL_DATE
AND from_unixtime(unix_timestamp(dflagwr.END_DATE, 'yyyyMMdd')) > dtddyr.FULL_DATE
;

或者您可以按照 cmets 的建议将 where 语句放在最后:

LEFT OUTER JOIN 
  (SELECT * FROM dffo
    WHERE 1 = 1 
    AND dffo.date = '20100909')dffot 
ON fppnonday.B_ACCT = dffot.B_CODE

LEFT OUTER JOIN 
  (SELECT * FROM  dflagw
    WHERE 1 = 1 
    AND dflagw.date = '20100909')dflagwr
ON fppnonday.CUER = dflagwr.CER
AND from_unixtime(unix_timestamp(dflagwr.START_DATE,'yyyyMMdd')) <= dtddyr.FULL_DATE
AND from_unixtime(unix_timestamp(dflagwr.END_DATE, 'yyyyMMdd')) > dtddyr.FULL_DATE

where ( from_unixtime(unix_timestamp(dffot.START_DATE,'yyyyMMdd')) <= dtddyr.FULL_DATE
AND from_unixtime(unix_timestamp(dffot.END_DATE,'yyyyMMdd')) <= dtddyr.FULL_DATE
AND (dffot.C_CODE = '000' OR dffot.NAG = 'Y'))
;

【讨论】:

  • 建议对查询结果没有影响吗?
  • @thecardcaptor 但是我们得到的只是未定义的代码,我们不知道提问者的意思。这个答案是在猜测提问者想要什么输出。回答者尤其不应该说“它不应该有任何影响”。
猜你喜欢
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
相关资源
最近更新 更多