验证MySQL EXCEPT查询正确性:筛选可删除的2023年备考资料路径
你的SQL查询问题分析
核心需求回顾
要筛选仅被2023年测试关联的备考资料路径——也就是排除那些同时被2024年或其他年份测试依赖的路径,最终用来删除这些路径的文件及对应数据库记录。
当前查询的问题
你写的EXCEPT语句存在逻辑漏洞:
EXCEPT是对整行数据进行去重排除,而你的查询返回的字段包含tests.id、tests.year、tests.Name_t这些和具体测试绑定的字段。- 举个例子:假设某个PATH同时被2023年的testA和2024年的testB关联,那么左边查询会返回
(PATH, testA.id, 2023, testA.Name),右边查询返回(PATH, testB.id, 2024, testB.Name)——这两行完全不同,EXCEPT不会排除左边的记录,最终会把这个被2024年共享的PATH错误地保留下来,完全不符合你的需求。
正确的查询写法
写法一:排除被其他年份关联的路径
SELECT DISTINCT tpm.PATH FROM test_prep_materials tpm JOIN tests t ON tpm.TID = t.ID WHERE t.YEAR = 2023 AND tpm.PATH NOT IN ( SELECT DISTINCT tpm2.PATH FROM test_prep_materials tpm2 JOIN tests t2 ON tpm2.TID = t2.ID WHERE t2.YEAR <> 2023 );
写法二:分组统计仅被2023年关联的路径
SELECT tpm.PATH FROM test_prep_materials tpm JOIN tests t ON tpm.TID = t.ID GROUP BY tpm.PATH HAVING MIN(t.YEAR) = 2023 AND MAX(t.YEAR) = 2023;
这两种写法都只返回仅属于2023年测试的路径,不会包含被其他年份共享的文件,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者ASDORDSAUSER
相关产品推荐
相关产品推荐

