hive - HIVEQL 和 Talend 中子查询之间的 NVL
问题描述
当它们之间有子查询时,是否可以调用 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,
正如我们所知,系统限制我们在选择中进行选择: 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
我必须尝试什么样的形式才能成功?
解决方案
假设 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
推荐阅读
- html - 如何使用 MathJax 字体“Gyre-Pagella”和“Computer Modern Bright”?
- java - Android:NFC 为 onTagDiscovered 线程构建监听器
- c# - (int) 对象解析给出“对象引用未设置为对象的实例”异常
- vba - 如何使用 CodeBlocks IDE 中生成的 .exe 在 VBA 代码中运行 CreateObject()
- python - 如何删除 tkinter 文本框末尾的空白行?
- video - 使用 FFmpeg 修剪视频并在其上添加回旋镖效果
- windows - 我需要创建一个独立的服务来检测和执行自定义 Windows 热键
- java - Spring Boot 应用程序启动后失败 - 尝试调用不存在的方法。尝试是从以下位置进行的
- reactjs - 有没有办法在反应中返回多个firebase方法
- laravel - 使用数据透视从另一个表中获取所有记录