【问题标题】:NVL between subqueries in HIVEQL and TalendHIVEQL 和 Talend 中子查询之间的 NVL
【发布时间】:2020-12-29 04:42:22
【问题描述】:

当它们之间有子查询时,是否可以调用 nvl?代码如下。

     NVL(
            (
            SELECT
            MIN(DATE_TIME)AS EFFECTIVE_DATE
            FROM TEMP.DM_ZEXPIDA_FICANT Z
            WHERE REGEXP_EXTRACT(CURR_HC,'([^;]+)',0)  = TEMP.AB_FICANT.CURR_CODE
            AND Z.DATE_TIME                            > TEMP.AB_FICANT.DATE_TIME
            ),
            (
            SELECT
            MIN(DATE_TIME)AS EFFECTIVE_DATE
            FROM TEMP.DM_ZEXPIDB_FICANT Z
            WHERE CURR_CODE = TEMP.AB_FICANT.CURR_CODE
            AND Z.DATE_TIME > TEMP.AB_FICANT.DATE_TIME
            ) 
    )AS EXPI_DATE,

我们知道系统限制我们在 select 中进行 make select: https://cwiki.apache.org/confluence/display/Hive/Subqueries+in+SELECT#space-menu-link-content

另外,我们只能在表格这样的情况下使用 CASE WHEN :

CASE WHEN rr IS NULL THEN kk
ELSE rr 
END AS EXPI_DATE

我必须尝试什么样的形式才能成功?

【问题讨论】:

  • 这种 SQL(SELECT inside SELECT)可能在 hive 中不起作用。请将它们转换为左连接子查询。然后在 NVL() 或 IFNULL() 中使用它们。让我知道这是否有帮助。
  • 这种情况下如何左加入?
  • 请参考下面的答案

标签: hive hiveql talend nvl


【解决方案1】:

假设 TEMP.AB_FICANT.KEY_COL 作为我在 SQL 下创建的驱动表中的 KEY。两个子查询都转换为左连接。现在,如果您没有键列,您可以加入 AB_FICANT 中唯一的某个列。

SELECT NVL( A.EFFECTIVE_DATE, B.EFFECTIVE_DATE) AS EXPI_DATE
    FROM TEMP.AB_FICANT DRIV
    LEFT JOIN (
            SELECT
            MIN(DATE_TIME)AS EFFECTIVE_DATE, INNER_DRIV.KEY_COL
            FROM TEMP.DM_ZEXPIDA_FICANT Z, TEMP.AB_FICANT INNER_DRIV
            WHERE REGEXP_EXTRACT(Z.CURR_HC,'([^;]+)',0)  = INNER_DRIV.CURR_CODE
            AND Z.DATE_TIME                            > INNER_DRIV.DATE_TIME
            GROUP BY INNER_DRIV.KEY_COL
            ) A ON A.KEY_COL=DRIV.KEY_COL
    LEFT JOIN (
            SELECT
            MIN(DATE_TIME)AS EFFECTIVE_DATE, INNER_DRIV.KEY_COL
            FROM TEMP.DM_ZEXPIDB_FICANT Z, TEMP.AB_FICANT INNER_DRIV
            WHERE CURR_CODE = INNER_DRIV.CURR_CODE
            AND Z.DATE_TIME > INNER_DRIV.DATE_TIME
            GROUP BY INNER_DRIV.KEY_COL
            ) B ON  B.KEY_COL=DRIV.KEY_COL

【讨论】:

  • 所以你的意思是我必须找到key_kol?
  • 我稍微修改了 sql,但我认为这不会解决这个错误。你认为你有临时模式中的所有表吗?您能否检查两个内部 SQL 是否都在工作。我可以在 2/3 小时后加入(现在在办公室)。
  • 嘿@thecardcaptor,问题解决了吗?
猜你喜欢
  • 2017-10-06
  • 1970-01-01
  • 2010-10-31
  • 2021-08-21
  • 2017-03-19
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
相关资源
最近更新 更多