使用JOIN查询关联表缺失属性的NULL占位值的SQL实现问题咨询
实现思路
核心是先生成指定请求下所有TaskId与属性主表全量属性的笛卡尔积作为基准行,再左关联属性值表补全数据,就能自动给未填写的属性生成NULL占位行。
具体SQL实现
SELECT base.RequestId, base.TaskId, base.AttrMasterId, cav.AttrValue, cav.RecordStatus FROM ( -- 生成目标请求下,每个任务对应所有属性的全量基准行 SELECT DISTINCT cav_req.RequestId, cav_req.TaskId, cam.AttrMasterId FROM AttributeValue cav_req CROSS JOIN AttributeMaster cam WHERE cav_req.RequestId = 200 -- 可替换为你要查询的请求ID,比如示例中的36498 AND cav_req.RecordStatus = 'A' ) base -- 左关联属性值表,匹配已填写的属性数据 LEFT JOIN AttributeValue cav ON base.RequestId = cav.RequestId AND base.TaskId = cav.TaskId AND base.AttrMasterId = cav.AttrMasterId AND cav.RecordStatus = 'A' ORDER BY base.TaskId, base.AttrMasterId;
逻辑说明
内层子查询先捞取目标请求下所有有效任务ID,和属性主表做交叉连接,保证每个任务都有和属性数量一致的基准行,比如示例中2个任务×2个属性=4行基准。外层用左连接关联属性值表,只有用户实际填写过的属性才会匹配到值,未填写的字段自动返回NULL,完全符合预期输出格式。
内容的提问来源于stack exchange,提问作者Mahe
相关产品推荐
相关产品推荐

