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

联合查询中按PS_JOB表PER_ORG规则仅展示单条用户记录

解决同一UserID返回多行记录的问题

没问题,我来帮你搞定这个重复行的问题!核心思路是给每个UserID的PS_JOB记录设置优先级——让EMP类型的记录优先被选中,确保每个UserID最终只返回一行数据。下面给你两种实用的解决方案:

方案1:用窗口函数(通用灵活,支持多类型优先级)

这种方法适合以后可能新增其他PER_ORG类型的场景,只需要调整优先级排序即可:

-- 先给每个UserID的PS_JOB记录按优先级排名
WITH RankedJobRecords AS (
    SELECT
        UserID,
        PER_ORG,
        -- 给EMP设置最高优先级(排名1),其他类型排后面
        ROW_NUMBER() OVER (
            PARTITION BY UserID 
            ORDER BY CASE WHEN PER_ORG = 'EMP' THEN 1 ELSE 2 END
        ) AS RecordRank
    FROM PS_JOB
)
-- 关联你的考试信息表,只取排名第一的记录
SELECT
    u.UserID,
    e.ExamDetails, -- 替换成你的考试信息字段
    rjr.PER_ORG,
    COUNT(*) OVER (PARTITION BY u.UserID) AS TotalExamCount -- 汇总总数
FROM YourExamTable e
JOIN YourUserTable u ON e.UserID = u.UserID
JOIN RankedJobRecords rjr ON u.UserID = rjr.UserID
WHERE rjr.RecordRank = 1 -- 只保留优先级最高的那条记录
-- 加上你原有的其他筛选条件
AND ...

方案2:直接关联筛选(适合仅两种类型的简单场景)

如果你的场景里PER_ORG只有EMP和CWR两种,这种写法更简洁:

SELECT
    u.UserID,
    e.ExamDetails,
    -- 优先取EMP的记录,没有的话再取CWR
    COALESCE(emp_job.PER_ORG, cwr_job.PER_ORG) AS PER_ORG,
    COUNT(*) OVER (PARTITION BY u.UserID) AS TotalExamCount
FROM YourExamTable e
JOIN YourUserTable u ON e.UserID = u.UserID
-- 先关联EMP类型的记录
LEFT JOIN PS_JOB emp_job ON u.UserID = emp_job.UserID AND emp_job.PER_ORG = 'EMP'
-- 再关联CWR类型(只有当没有EMP记录时才会生效)
LEFT JOIN PS_JOB cwr_job ON u.UserID = cwr_job.UserID AND cwr_job.PER_ORG = 'CWR'
-- 确保至少有一条JOB记录
WHERE emp_job.UserID IS NOT NULL OR cwr_job.UserID IS NOT NULL
-- 原有的其他筛选条件
AND ...

注意点

  • 把代码里的YourExamTable、YourUserTable、ExamDetails替换成你实际的表名和字段名
  • 如果原查询用了GROUP BY,记得调整分组逻辑,确保每个UserID只被分组一次

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:28:20