求助:编写SQL查询存在多条dsp_fg='Y'记录的code对应行
解决存在多条主要描述记录的查询问题
嘿,这个问题我熟!我来给你两种实用的解决方案,帮你找出那些存在多条*主要描述(dsp_fg='Y')*的code对应的所有记录:
方法一:使用窗口函数(推荐,简洁高效)
窗口函数可以直接在原表基础上计算每个code下的主要描述数量,一步筛选出目标行,适合支持窗口函数的数据库(比如MySQL 8+、PostgreSQL、SQL Server等):
WITH problematic_code_stats AS ( SELECT *, -- 统计每个code下dsp_fg='Y'的记录数 COUNT(CASE WHEN dsp_fg = 'Y' THEN 1 END) OVER (PARTITION BY code) AS primary_desc_count FROM your_table_name -- 替换成你的表名 ) -- 筛选出主要描述数大于1的code对应的所有行 SELECT * FROM problematic_code_stats WHERE primary_desc_count > 1;
这个CTE(公共表表达式)会先给每条记录打上所属code的主要描述数量标签,之后只需要筛选数量大于1的记录即可,结果会包含该code的所有行(不管dsp_fg是'Y'还是'N')。
方法二:使用子查询关联(兼容性强)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以先用子查询找出存在多条主要描述的code,再关联原表获取所有对应行:
SELECT t.* FROM your_table_name t -- 替换成你的表名 INNER JOIN ( -- 先找出有多个dsp_fg='Y'的code SELECT code FROM your_table_name WHERE dsp_fg = 'Y' GROUP BY code HAVING COUNT(*) > 1 ) bad_codes ON t.code = bad_codes.code;
这个方法先通过分组统计筛选出违规的code,再用关联查询把这些code的所有记录拉出来,逻辑清晰,兼容性更好。
额外说明
如果你只需要查看那些dsp_fg='Y'的违规行(而不是该code的所有行),只需要在最终的SELECT语句里加上AND dsp_fg = 'Y'的条件即可。
内容的提问来源于stack exchange,提问作者Jason Riley
相关产品推荐
相关产品推荐

