我在尝试连接同一个表中的子查询时遇到了问题,但没有返回结果。
SELECT
CA.PARTICIPANT || CA.RECOGNITION_MONTH || CA.RECOGNITION_YEAR,
CA.PLAN_NAME,
PL.PLAN_NAME
FROM
CSBI_DB.CS_SALES_OPS.CS_COMP_ANLTCS CA
LEFT JOIN
(
SELECT DISTINCT
PARTICIPANT || RECOGNITION_MONTH || RECOGNITION_YEAR AS MATCH_STRING,
PLAN_NAME
FROM
CSBI_DB.CS_SALES_OPS.CS_COMP_ANLTCS
WHERE
PLAN_NAME IS NOT NULL
) PL
ON
TO_VARCHAR(PL.MATCH_STRING) = TO_VARCHAR(CA.PARTICIPANT || CA.RECOGNITION_MONTH || CA.RECOGNITION_YEAR)
WHERE
CA.PLAN_NAME IS NULL
我尝试了上述方法的几种变体,但没有填充 PL.PLAN_NAME 的结果。如果我仅使用“PARTICIPANT”(varchar 数据类型)字段加入,则结果将填充(尽管不是所需的结果),如果我仅使用连接的“RECOGNITION_MONTH”和“RECOGNITION_YEAR”(均为数字数据类型)字段加入,但在组合时两个我不断得到空结果。我也尝试过加入不将数字字段转换为 varchar 但没有运气。这看起来应该很简单,但显然我错过了一些东西......有人知道我哪里出错了吗?
如果这些列中的任何一个为 NULL(上面的注释表明它们是 NULL),那么串联最终将变为 NULL。这意味着您不会获得该连接条件的匹配项,因为 NULL 不 = NULL。
要修复此问题,您需要将可 NULL 字段合并为非 NULL 值,例如:
NVL(participant, '') || NVL(recognition_month, '') || NVL(recognition_year, '')
,或任何可 NULL 字段。
如果您命名第一个选择结果,Snowflake将允许您在where子句中使用该标签,因此SQL可以更简单一些,如下所示:
SELECT
ca.participant || ca.recognition_month || ca.recognition_year AS ca_match_string,
ca.plan_name,
pl.plan_name
FROM
csbi_db.cs_sales_ops.cs_comp_anltcs AS ca
LEFT JOIN
(
SELECT DISTINCT
participant || recognition_month || recognition_year AS match_string,
plan_name
FROM
csbi_db.cs_sales_ops.cs_comp_anltcs
WHERE
plan_name IS NOT NULL
) AS pl
ON
pl.match_string = ca_match_string
WHERE
ca.plan_name IS NULL