SQL Server查询未关联'pics'/'info'标签的Downloads记录问题
解决Downloads表筛选无指定标签记录的分页查询问题
你的原SQL之所以出现错误结果,问题出在两个地方:
- 内连接会把只要关联了非pics/info标签的文件都捞出来,哪怕这个文件同时关联了pics或info(比如FILE2关联了compressed和pics,内连接会匹配compressed那一行,导致FILE2被错误选中)
- 一个文件关联多个标签时,会生成多条重复记录,分页逻辑也会被这些重复数据打乱
要实现只返回完全没有关联pics或info标签的Downloads记录(也就是ID为1和3的文件),可以用以下两种写法:
方法1:用NOT IN排除关联指定标签的文件
SELECT * FROM ( SELECT d._modifieddate, d.File, d.ID, ROW_NUMBER() OVER (ORDER BY d._modifieddate DESC) AS aa FROM Downloads d WHERE d.ID NOT IN ( -- 先找出所有关联了pics或info的文件ID SELECT ft.FileID FROM File_Tag ft JOIN TagNames tn ON ft.TagID = tn.ID WHERE tn.TagName IN ('pics', 'info') ) ) AS product -- 按需添加分页条件,比如 WHERE aa BETWEEN 1 AND 10
方法2:用NOT EXISTS(性能更优,适合大数据量)
SELECT * FROM ( SELECT d._modifieddate, d.File, d.ID, ROW_NUMBER() OVER (ORDER BY d._modifieddate DESC) AS aa FROM Downloads d WHERE NOT EXISTS ( -- 检查当前文件是否关联了pics或info标签 SELECT 1 FROM File_Tag ft JOIN TagNames tn ON ft.TagID = tn.ID WHERE ft.FileID = d.ID AND tn.TagName IN ('pics', 'info') ) ) AS product -- 按需添加分页条件,比如 WHERE aa BETWEEN 1 AND 10
这两种写法的核心逻辑都是先排除所有关联了pics或info的文件,剩下的就是完全符合要求的记录,同时每个文件只返回一次,不会出现重复,分页的ROW_NUMBER也能正常工作。
内容的提问来源于stack exchange,提问作者ahmed mobarak
相关产品推荐
相关产品推荐

