使用SELECT DISTINCT结合INNER JOIN仍出现重复记录问题求助
解决INNER JOIN后SELECT DISTINCT仍返回重复记录的问题
我一眼就看出问题所在了——你关联的Files表中,同一个SID对应了多条文件记录!这就是SELECT DISTINCT失效的核心原因:虽然其他字段内容都一致,但Files.*里的细节(比如不同的PaperKey、文件名)让每一行都是唯一的,DISTINCT会把这些当成不同的行全部保留下来。
要实现你期望的每个SID只返回一条记录的效果,你需要先给每个SID下的文件记录做排序筛选,只保留其中一条(比如你示例输出里的最后一条)。这里用窗口函数ROW_NUMBER()是最直接的解决方案:
WITH RankedFiles AS ( SELECT *, -- 按PaperKey倒序给每个SID的文件排号,最大的PaperKey会被标记为第1位 ROW_NUMBER() OVER (PARTITION BY SID ORDER BY PaperKey DESC) AS FileRank FROM Files ) SELECT Submission.MID AS Expr16, RevAssaignments.Rev1Name AS Expr18, RevAssaignments.Rev2Name AS Expr19, RevAssaignments.Rev3Name AS Expr20, RevAssaignments.Rev1Status AS Expr21, RevAssaignments.Rev2Status AS Expr22, RevAssaignments.Rev3Status AS Expr23, Submission.Title AS Expr2, Submission.SID AS Expr1, RankedFiles.PaperKey AS Expr7, Submission.CoAuth AS Expr3, Submission.Email AS Expr4, Submission.CopyRightDate AS Expr5, Submission.Status AS Expr6, RankedFiles.* FROM RevAssaignments INNER JOIN Submission ON RevAssaignments.SID = Submission.SID INNER JOIN RankedFiles ON Submission.SID = RankedFiles.SID WHERE (Submission.Status = 'ACCEPTED ') AND RankedFiles.FileRank = 1 -- 只保留每个SID下排第1的文件记录 ORDER BY Expr16
关键细节说明:
- CTE
RankedFiles:给Files表中每个SID的记录按PaperKey倒序分配序号,序号为1的就是你示例中期望保留的那条记录(对应最大的PaperKey)。 - 筛选关联结果:在最终关联时只取
FileRank = 1的记录,这样每个SID就只会返回一条文件数据,自然不会出现重复。 - 如果你的筛选规则不是按
PaperKey倒序,改成你需要的字段即可(比如文件上传时间UploadTime DESC),只要能准确定位到你想保留的那条记录就行。
内容的提问来源于stack exchange,提问作者sunilnoty
相关产品推荐
相关产品推荐

