如何查询t_audit表中被user_id=1更新未被user_id=2更新的用户名
问题分析
原SQL无法运行的核心问题有两个:
NOT EXISTS语法使用错误:该关键字必须跟随完整的子查询语句,不能直接写条件表达式- 缺少同客户关联逻辑:没有限定子查询筛选的是和外层查询同一个客户的更新记录,即便语法改对也无法实现「当前客户未被user_id=2更新」的判断
修正方案(NOT EXISTS 写法)
增加子查询并关联同客户姓名,同时添加DISTINCT避免同一客户被多次更新导致返回重复结果:
SELECT DISTINCT ta.name FROM t_audit ta WHERE ta.updated = 'Y' AND ta.user_id = 1 AND NOT EXISTS ( SELECT 1 FROM t_audit ta2 WHERE ta2.name = ta.name AND ta2.updated = 'Y' AND ta2.user_id = 2 );
可选替代方案(GROUP BY 写法)
如果习惯用分组聚合逻辑,也可以用以下写法实现相同需求:
SELECT name FROM t_audit WHERE updated = 'Y' AND user_id IN (1, 2) GROUP BY name HAVING SUM(CASE WHEN user_id = 1 THEN 1 ELSE 0 END) >= 1 AND SUM(CASE WHEN user_id = 2 THEN 1 ELSE 0 END) = 0
内容的提问来源于stack exchange,提问作者lollah mullah
相关产品推荐
相关产品推荐

