【问题标题】:How to LEFT OUTER JOIN on specific column values in HIVEQL?如何在 HIVEQL 中的特定列值上进行 LEFT OUTER JOIN?
【发布时间】:2018-03-28 17:21:52
【问题描述】:

当我运行以下 HiveQL 代码时出现错误: 执行错误:编译语句时出错:失败:SemanticException [错误 10004]:第 1 行:2112 无效的表别名或 列引用“T3”

    SELECT *        
    FROM CC_CLAIM_EXT T1
    INNER JOIN CC_EXPOSURE_EXT T2 ON (T1.ID = T2.CLAIMID)
    LEFT OUTER JOIN CC_POLICY_EXT T3 ON (T1.POLICYID = T3.ID)
    LEFT OUTER JOIN CC_COVERAGE_EXT T4 ON (T2.COVERAGEID = T4.ID)
    LEFT OUTER JOIN CC_TRANSACTION_EXT T5 ON (T2.ID = T5.EXPOSUREID)
    LEFT OUTER JOIN CC_TRANSACTIONSET_EXT T6 ON (T5.TRANSACTIONSETID = T6.ID)
    LEFT OUTER JOIN CC_TRANSACTIONLINEITEM_EXT T7 ON (T5.ID = T7.TRANSACTIONID)
    LEFT OUTER JOIN CC_RISKUNIT_EXT T12 ON (T4.RISKUNITID = T12.ID)
    LEFT OUTER JOIN CC_CLASSCODE_EXT T13 ON (T12.CLASSCODEID = T13.ID)

    LEFT OUTER JOIN (SELECT TT12.CLAIMID
                            ,CASE WHEN COUNT(TT13.PRIMARYBODYPART) > 1 THEN 10010 ELSE MAX(TT13.PRIMARYBODYPART) END AS PRIMARYBODYPART
                            ,CASE WHEN COUNT(TT13.DETAILEDBODYPART) > 1 THEN 10010 ELSE MAX(TT13.DETAILEDBODYPART) END AS DETAILEDBODYPART
                    FROM CC_INCIDENT_EXT TT12
                    LEFT OUTER JOIN CC_BODYPART_EXT TT13 ON (TT12.ID = TT13.INCIDENTID)
                    GROUP BY TT12.CLAIMID) T14 
    ON (T1.ID = T14.CLAIMID AND T3.POLICYTYPE IN(10022,10023))

    WHERE T1.STATE IN(2,3)
        AND T2.STATE IN(2,3)
        AND T6.APPROVALSTATUS = 1
        AND T7.RETIRED = 0

    ORDER BY CLAIMNUMBER
        ,EXPOSUREID
        ,TRANSACTIONID

我已经把范围缩小到了:

    ON (T1.ID = T14.CLAIMID AND T3.POLICYTYPE IN(10022,10023))

如果我删除:

    AND T3.POLICYTYPE IN(10022,10023)

代码运行良好。有没有更好的方法来限制 HiveQL 中的这种联接?

【问题讨论】:

    标签: hadoop hive hiveql


    【解决方案1】:

    错误是因为您在 T1 和 T14 之间的左连接上放置了一个引用,但是您将 T3 放在了条件上。要将您的查询限制在您指定的 T3.policy_id,您应该沿着您离开连接 T1 和 T3 的行输入。见下文第 4 行:

    SELECT *        
        FROM CC_CLAIM_EXT T1
        INNER JOIN CC_EXPOSURE_EXT T2 ON (T1.ID = T2.CLAIMID)
        LEFT OUTER JOIN CC_POLICY_EXT T3 ON (T1.POLICYID = T3.ID AND T3.POLICYTYPE IN(10022,10023))
        LEFT OUTER JOIN CC_COVERAGE_EXT T4 ON (T2.COVERAGEID = T4.ID)
        LEFT OUTER JOIN CC_TRANSACTION_EXT T5 ON (T2.ID = T5.EXPOSUREID)
        LEFT OUTER JOIN CC_TRANSACTIONSET_EXT T6 ON (T5.TRANSACTIONSETID = T6.ID)
        LEFT OUTER JOIN CC_TRANSACTIONLINEITEM_EXT T7 ON (T5.ID = T7.TRANSACTIONID)
        LEFT OUTER JOIN CC_RISKUNIT_EXT T12 ON (T4.RISKUNITID = T12.ID)
        LEFT OUTER JOIN CC_CLASSCODE_EXT T13 ON (T12.CLASSCODEID = T13.ID)
        LEFT OUTER JOIN (SELECT TT12.CLAIMID
                                ,CASE WHEN COUNT(TT13.PRIMARYBODYPART) > 1 THEN 10010 ELSE MAX(TT13.PRIMARYBODYPART) END AS PRIMARYBODYPART
                                ,CASE WHEN COUNT(TT13.DETAILEDBODYPART) > 1 THEN 10010 ELSE MAX(TT13.DETAILEDBODYPART) END AS DETAILEDBODYPART
                        FROM CC_INCIDENT_EXT TT12
                        LEFT OUTER JOIN CC_BODYPART_EXT TT13 ON (TT12.ID = TT13.INCIDENTID)
                        GROUP BY TT12.CLAIMID) T14 
        ON T1.ID = T14.CLAIMID
        WHERE T1.STATE IN(2,3)
            AND T2.STATE IN(2,3)
            AND T6.APPROVALSTATUS = 1
            AND T7.RETIRED = 0
        ORDER BY CLAIMNUMBER
            ,EXPOSUREID
            ,TRANSACTIONID
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 2011-06-12
      • 2020-11-22
      • 2010-09-29
      • 2018-01-21
      • 2019-07-23
      • 1970-01-01
      相关资源
      最近更新 更多