联合查询中按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
相关产品推荐
相关产品推荐

