Snowflake关联三张表时第三张表返回NULL值问题咨询
问题分析与解决方案
你的情况确实和表C同时关联A、B两个表的字段有关,但核心原因是左连接B表带来的NULL值传播,具体拆解如下:
核心原因
左连接B表的NULL值影响
你对B表使用了LEFT JOIN,这意味着如果A表的JOIN_KEY截取后匹配不到B表的Material,B表的所有字段(包括BOD_CODE)都会返回NULL。而表C的关联条件包含B.BOD_CODE = C.BODCODE,在Snowflake中NULL与任何值比较的结果都是UNKNOWN,无法匹配到C表的任何记录,因此这部分A表记录对应的C字段会返回NULL。单独查询与整体SQL的差异
你单独用A、B的对应值查询C能得到结果,是因为你选取的是B表有匹配结果的A表记录(此时B.BOD_CODE非空),但整体SQL包含了B表无匹配的A表记录,这部分记录自然无法关联到C表。
可行解决方案
方案1:过滤B表无匹配的记录
如果业务上只需要A表能匹配到B表的记录,可将A和B的LEFT JOIN改为INNER JOIN,直接排除B.BOD_CODE为NULL的记录,让C表的关联正常匹配:SELECT* FROM "TERADATA"."PRD_DWH_VIEW_LMT"."GSC_VAL_LIST_VIEW" AS A INNER JOIN (SELECT MATERIAL, BASE_UNIT_OF_MEASURE, BOD_CODE, STANDARD_PRICE, NET_WGT, WEIGHT_UNIT, VOLUME, VOLUME_UNIT, PRD_CAT_MGR, Week_Of FROM "TERADATA"."PRD_DWH_VIEW_LMT"."ECC_MATERIAL_ATTRIBUTES_VIEW" WHERE Week_Of = (SELECT MAX(Week_Of) FROM "TERADATA"."PRD_DWH_VIEW_LMT"."ECC_MATERIAL_ATTRIBUTES_VIEW") AND SALES_ORG = '2900') AS B ON SUBSTR(JOIN_KEY, 1, LENGTH(JOIN_KEY) - 3) = B.Material LEFT JOIN (SELECT SRLOC, PLANT, BODCODE FROM "TERADATA"."PRD_DWH_VIEW_LMT"."ZZMMSPECPRO_V") AS C ON RIGHT (A.JOIN_KEY, 3) = C.PLANT AND B.BOD_CODE = C.BODCODE WHERE LIST_ID = 'OTO'方案2:保留所有A表记录,兼容B表NULL的情况
如果需要保留所有A表记录,且业务逻辑允许在B表无匹配时仅通过PLANT关联C表,可调整C表的关联条件:LEFT JOIN (SELECT SRLOC, PLANT, BODCODE FROM "TERADATA"."PRD_DWH_VIEW_LMT"."ZZMMSPECPRO_V") AS C ON RIGHT (A.JOIN_KEY, 3) = C.PLANT AND (B.BOD_CODE = C.BODCODE OR B.BOD_CODE IS NULL)方案3:检查字段匹配细节
排查字段一致性问题:- 确认
B.BOD_CODE和C.BODCODE的字段类型是否一致(比如一个是字符串、一个是数值) - 检查是否存在大小写、空格差异,可尝试用
TRIM(UPPER(B.BOD_CODE)) = TRIM(UPPER(C.BODCODE))消除格式影响
- 确认
内容的提问来源于stack exchange,提问作者Kartik
相关产品推荐
相关产品推荐

