SQL如何根据不同列的取值条件筛选对应art字段所属的行数据
SQL查询解决方案
以下是适配需求的查询实现,支持主流SQL引擎:
支持窗口函数的SQL引擎(MySQL8.0+、PostgreSQL、Oracle等)
使用CTE+窗口函数实现,逻辑清晰易维护:
WITH art_group_marker AS ( SELECT *, -- 按art分组标记当前组是否存在stdvpuni=1的行 MAX(CASE WHEN stdvpuni = 1 THEN 1 ELSE 0 END) OVER(PARTITION BY art) AS group_has_stdvpuni1 FROM 替换为你的实际表名 ) SELECT * FROM art_group_marker WHERE -- 规则1:stdvpuni为1的行直接返回 stdvpuni = 1 -- 规则2:组内无stdvpuni=1的行时,返回组内STDUNIABG为1的行 OR (group_has_stdvpuni1 = 0 AND STDUNIABG = 1);
低版本MySQL兼容实现(不支持窗口函数/CTE场景)
用关联子查询实现相同逻辑:
SELECT t.* FROM 替换为你的实际表名 t WHERE t.stdvpuni = 1 OR ( NOT EXISTS (SELECT 1 FROM 替换为你的实际表名 t2 WHERE t2.art = t.art AND t2.stdvpuni = 1) AND t.STDUNIABG = 1 );
补充说明
- 若同一个art分组下存在多条STDUNIABG=1的行,上述语句会全部返回,如需仅返回单条,可自行添加排序逻辑后取首行即可
- 运行前请将代码中的
替换为你的实际表名修改为你自己的数据表名称
内容的提问来源于stack exchange,提问作者Gregor Schuerer
相关产品推荐
相关产品推荐

