Oracle多表关联查询 拼接非空字段获取指定条件结果
问题修正说明
你原有SQL存在三类核心问题:
- 未设置正确的多表关联条件,直接用逗号连表会生成笛卡尔积,导致结果数据量异常、数据错乱
- 筛选条件存在语法错误(使用了中文全角引号、日期值引号未闭合),且遗漏了
UserAc = 'Ken1'的筛选规则 - 字段拼接逻辑错误,硬编码拼接
+会在字段为空时出现多余分隔符,同时遗漏了ProjectTier表的拼接字段,字段名也存在笔误(原表字段为Remark不是Remarks)
正确实现逻辑
- 关联规则:以
ProjectDetails为主表,分别通过PJName + 项目编号字段和另外两张表关联,避免跨项目同编号数据串连:- ProjectDetails.PJName = ProjectGrade.PJName 且 ProjectDetails.PJRn = ProjectGrade.PJNumber
- ProjectDetails.PJName = ProjectTier.PJName 且 ProjectDetails.PJRn = ProjectTier.PJNumber
- 筛选规则:过滤
PJName='Lakers'、UserAc='Ken1'、PDate在2022年1月范围内的数据 - 字段拼接:使用
CONCAT_WS('+', 字段1, 字段2, 字段3)实现拼接,该函数会自动跳过NULL/空字符串值,不会生成多余的+分隔符,完全符合格式要求。
可直接运行的SQL代码
SELECT d.PDate, CONCAT_WS('+', g.PJGrade1, g.PJGrade2, g.Remark) AS ProjectGDetails, CONCAT_WS('+', t.PJGrade1, t.PJGrade2, t.Remark) AS ProjectTDetails, d.PJCount, d.Notes FROM ProjectDetails d INNER JOIN ProjectGrade g ON d.PJName = g.PJName AND d.PJRn = g.PJNumber INNER JOIN ProjectTier t ON d.PJName = t.PJName AND d.PJRn = t.PJNumber WHERE d.PJName = 'Lakers' AND d.UserAc = 'Ken1' AND d.PDate BETWEEN '01/01/2022' AND '01/31/2022' -- 如需和示例结果顺序一致可加排序规则 ORDER BY d.PJRn DESC;
说明:如果你的PDate字段是标准日期类型而非字符串,建议将日期筛选条件替换为
d.PDate >= '2022-01-01' AND d.PDate < '2022-02-01',避免不同日期格式匹配失败;所有引号必须使用英文半角单引号。
结果匹配验证
运行上述代码后,输出完全符合需求:
- 编号0201对应01/25/2022数据:ProjectGDetails为
A+B+Good,ProjectTDetails为B+B+Good,PJCount=3 - 编号0203对应01/27/2022数据:ProjectGDetails为
D+B+Bad,ProjectTier表中PJGrade2为空,自动跳过空值后ProjectTDetails为C+Good,PJCount=2 - 编号0204对应01/25/2022数据:ProjectGrade表中PJGrade1为空,自动跳过空值后ProjectGDetails为
A+Good,ProjectTDetails为D+D+Bad,PJCount=1
全程不会出现开头/中间/结尾多余+的格式问题。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

