You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle多表关联查询 拼接非空字段获取指定条件结果

问题修正说明

你原有SQL存在三类核心问题:

  • 未设置正确的多表关联条件,直接用逗号连表会生成笛卡尔积,导致结果数据量异常、数据错乱
  • 筛选条件存在语法错误(使用了中文全角引号、日期值引号未闭合),且遗漏了UserAc = 'Ken1'的筛选规则
  • 字段拼接逻辑错误,硬编码拼接+会在字段为空时出现多余分隔符,同时遗漏了ProjectTier表的拼接字段,字段名也存在笔误(原表字段为Remark不是Remarks)
正确实现逻辑
  1. 关联规则:以ProjectDetails为主表,分别通过PJName + 项目编号字段和另外两张表关联,避免跨项目同编号数据串连:
    • ProjectDetails.PJName = ProjectGrade.PJName 且 ProjectDetails.PJRn = ProjectGrade.PJNumber
    • ProjectDetails.PJName = ProjectTier.PJName 且 ProjectDetails.PJRn = ProjectTier.PJNumber
  2. 筛选规则:过滤PJName='Lakers'、UserAc='Ken1'、PDate在2022年1月范围内的数据
  3. 字段拼接:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:06:20