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