【问题标题】:can I use a subquery in a case clause我可以在 case 子句中使用子查询吗
【发布时间】:2020-09-27 09:49:14
【问题描述】:

以下代码会产生以下错误: Teradata prepare:CASE 表达式的 WHEN 子句中的非法表达式

代码:

SELECT  t1.account_id,
            t1.Expanded_Account_Name_REV,
            t2.account_start_date,
            t2.acct_economic_sector,
            CASE
                WHEN t1.account_id IN (SELECT DISTINCT account_id
                                       FROM dwp1_view.GH140_OWNER_ACCOUNT_WARNINGS 
                                       WHERE warning_type_code in (251,323)
                                       AND warning_end_date > date 
                                       )
                THEN 1
                ELSE 0
            END AS warning_ind
FROM (SELECT *
          FROM compliance.gmah
          ) t1
    LEFT JOIN gc01_account t2
    ON t1.account_id = t2.account_id
    LEFT JOIN (SELECT *
               FROM T0120_Account_Attribute
               WHERE 1=1
               AND Account_Attribute_Code = 821
               AND History_Ind = 0
               ) t3
    ON t1.account_id = t3.account_id

【问题讨论】:

    标签: sas case teradata


    【解决方案1】:

    您必须将逻辑重写为 *Correlated Scalar Subquery"

            CASE
                WHEN t1.account_id = (SELECT max(account_id)
                                       FROM dwp1_view.GH140_OWNER_ACCOUNT_WARNINGS as oaw
                                       WHERE warning_type_code in (251,323)
                                       AND warning_end_date > date 
                                       AND oaw.account_id = t1.account_id
                                      )
                THEN 1
                ELSE 0
            END AS warning_ind
    

    但是那些子查询往往有一个奇怪的计划,使用另一个 Outer Join 重写它可能更有效:

    SELECT  t1.account_id,
                t1.Expanded_Account_Name_REV,
                t2.account_start_date,
                t2.acct_economic_sector,
    --************
                CASE WHEN oaw.warning_ind IS NULL THEN 0 ELSE 1 end AS warning_ind
    --************
    FROM (SELECT *
              FROM compliance.gmah
              ) t1
        LEFT JOIN gc01_account t2
        ON t1.account_id = t2.account_id
        LEFT JOIN (SELECT *
                   FROM T0120_Account_Attribute
                   WHERE 1=1
                   AND Account_Attribute_Code = 821
                   AND History_Ind = 0
                   ) t3
        ON t1.account_id = t3.account_id
    --************
        LEFT JOIN 
        (
          SELECT DISTINCT account_id
          FROM dwp1_view.GH140_OWNER_ACCOUNT_WARNINGS 
          WHERE warning_type_code IN (251,323)
          AND warning_end_date > DATE 
        ) AS oaw
        ON t1.account_id = oaw.account_id
    --************
    

    【讨论】:

    • 非常感谢!非常有帮助;另一个问题:我注意到因为我使用 AND oaw.account_id = t1.account_id - MAX(account_id) 没有实际需要。我错了吗?
    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多