HIVE当前子查询表达式仅允许用作Where子句谓词

在从Oracle迁移到Hive的过程中,遇到了不支持字段内子查询的问题。原Oracle脚本中使用了复杂的子查询来填充字段,但在Hive中此类子查询仅限于Where子句。通过调整SQL结构,将子查询作为外部表连接,成功解决了这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在进行一次Oracle存过迁移hive的语法中报错了

ORACLE脚本
下面展示一些 内联代码片

// ORACLE语法
SELECT 
         (CASE  WHEN EXISTS (SELECT 1
                 FROM CHANNEL.ORGANIZATION@TO_AGENT_CHANNEL N
                WHERE N.PARTY_ID = A.ORG_ID
                  AND N.ORG_LEVEL = 7
                  AND N.ORG_TYPE = '001') THEN
          (SELECT B.COL13
             FROM CHANNEL.WORK_SHOP@TO_AGENT_CHANNEL W
                JOIN CHANNEL.CHANNEL@TO_AGENT_CHANNEL M  ON M.WORK_SHOP_ID = W.WORK_SHOP_ID
                LEFT JOIN CHANNEL.WORK_SHOP_EXT@TO_AGENT_CHANNEL B ON W.WORK_SHOP_ID =
                                                          B.WORK_SHOP_ID
            WHERE M.ORG_ID = A.ORG_ID
              )
         WHEN EXISTS (SELECT 1
                 FROM CHANNEL.ORGANIZATION@TO_AGENT_CHANNEL N
                WHERE N.PARTY_ID = A.ORG_ID
                  AND N.ORG_LEVEL = 8
                  AND N.ORG_TYPE = '001') THEN
          (SELECT B.COL13 FROM CHANNEL.WORK_SHOP@TO_AGENT_CHANNEL W
             LEFT JOIN CHANNEL.WORK_SHOP_EXT@TO_AGENT_CHANNEL B ON W.WORK_SHOP_ID =
                                                          B.WORK_SHOP_ID          
             WHERE W.ORG_ID = A.ORG_ID)
         ELSE
          NULL
       END) 归属门店编码
        FROM CHANNEL.STAFF@TO_AGENT_CHANNEL A;
// 转成hive语法
  (CASE  WHEN EXISTS (SELECT 1
                 FROM  IP_BSS_DAY.INF_CHANNEL_ORGANIZATION_D  N 
                WHERE set_day = '${yesterday}' and  N.PARTY_ID = A.ORG_ID   AND N.ORG_LEVEL = 7  AND N.ORG_TYPE = '001') THEN  c.COL13
        WHEN EXISTS (SELECT 1
                 FROM  IP_BSS_DAY.INF_CHANNEL_ORGANIZATION_D  N 
                WHERE set_day = '${yesterday}' and  N.PARTY_ID = A.ORG_ID   AND N.ORG_LEVEL = 8  AND N.ORG_TYPE = '001') THEN  d.COL13 end)  CHANNEL_NBR
   
from (select * from IP_BSS_DAY.STAFF_CHANNEL where set_day = '${yesterday}') A
left join (select * FROM IP_BSS_DAY.INF_CHANNEL_ORGANIZATION_D where set_day = '${yesterday}') B ON A.ORG_ID = B.PARTY_ID
left join  TEMP_DEVELOPER.TEMP_MI_MID_INDEX_CH_STAFF_D_1_${yesterday} c  on a.ORG_ID = c.ORG_ID
left join TEMP_DEVELOPER.TEMP_MI_MID_INDEX_CH_STAFF_D_2_${yesterday} d on a.ORG_ID = d.ORG_ID;

报错信息

语句异常:Error while compiling statement: FAILED: SemanticException [Error 10249]: Line 1:887 Unsupported SubQuery Expression ‘‘001’’: Currently SubQuery expressions are only allowed as Where Clause predicates
在这里插入图片描述

查找原因

行1:887不支持的子查询表达式“001”:当前子查询表达式仅允许用作Where子句谓词
指的是hive 并不支持像oracle那样在字段里进行子查询

修改HIve sql

1、尝试将字段子查询 放在主表后面关联主表
下面展示一些 内联代码片

// A code block
select 
   CASE  WHEN  n.PARTY_ID IS NOT NULL  THEN  c.COL13
         WHEN  M.PARTY_ID IS NOT NULL  THEN  d.COL13 end  CHANNEL_NBR
   
from (select * from IP_BSS_DAY.STAFF_CHANNEL where set_day = '${yesterday}') A
left join (select * FROM IP_BSS_DAY.INF_CHANNEL_ORGANIZATION_D where set_day = '${yesterday}') B ON A.ORG_ID = B.PARTY_ID
left join (SELECT * FROM  IP_BSS_DAY.INF_CHANNEL_ORGANIZATION_D   WHERE set_day = '${yesterday}' and   ORG_LEVEL = 7  AND ORG_TYPE = '001') N ON N.PARTY_ID = A.ORG_ID 
left join (SELECT * FROM  IP_BSS_DAY.INF_CHANNEL_ORGANIZATION_D   WHERE set_day = '${yesterday}' and   ORG_LEVEL = 8  AND ORG_TYPE = '001') M ON M.PARTY_ID = A.ORG_ID  
left join  TEMP_DEVELOPER.TEMP_MI_MID_INDEX_CH_STAFF_D_1_${yesterday} c  on a.ORG_ID = c.ORG_ID
left join TEMP_DEVELOPER.TEMP_MI_MID_INDEX_CH_STAFF_D_2_${yesterday} d on a.ORG_ID = d.ORG_ID;


结果:执行成功

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值