我可以在 case 子句中使用子查询吗
can I use a subquery in a case clause
以下代码生成以下错误:
Teradata 准备: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
您必须将逻辑重写为 *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
--************
以下代码生成以下错误: Teradata 准备: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
您必须将逻辑重写为 *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
--************