我可以在case子句中使用子查询吗

时间:2020-06-08 12:17:41

标签: sas case teradata

以下代码生成以下错误: 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

1 个答案:

答案 0 :(得分:0)

您必须将逻辑重写为*相关的标量子查询“

        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

但是这些子查询往往有一个奇怪的计划,使用另一个外部联接重写它可能会更有效:

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
--************