You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于GROUP BY筛选未设置默认地址人员的SQL查询问题求助

解决未设置默认地址的人员筛选问题

嘿,我来帮你捋捋这个SQL的问题~你的需求是找出没有设置默认地址的人员,但你写的原SQL逻辑完全搞反了,咱们一步步来修正:

原SQL的问题分析

你写的语句:

SELECT * FROM Person p WHERE p.pid IN (select a.pid from Address a where a.is_default <> -1 group by a.pid)

这个逻辑是筛选出那些至少有一个非默认地址的用户——这和你要的“没设置默认地址”完全不是一回事,甚至会把大部分有默认地址的用户也包含进来(毕竟他们大概率还有其他非默认地址),自然返回的结果不对。

正确的SQL写法

假设你的is_default = -1代表“是默认地址”,下面几种写法都能满足需求,选你顺手的就行:

方法1:用NOT EXISTS(逻辑最清晰,性能也不错)

这种写法直接检查每个用户是否不存在对应的默认地址记录,非常直观:

SELECT * 
FROM Person p
WHERE NOT EXISTS (
    SELECT 1 
    FROM Address a 
    WHERE a.pid = p.pid 
      AND a.is_default = -1 -- 这里替换成你的默认地址标识值
)

方法2:分组统计默认地址数量

先统计每个用户的默认地址总数,再筛选出数量为0的用户:

SELECT p.*
FROM Person p
LEFT JOIN (
    SELECT pid, COUNT(*) AS default_count
    FROM Address
    WHERE is_default = -1
    GROUP BY pid
) a ON p.pid = a.pid
WHERE a.default_count IS NULL OR a.default_count = 0

如果需要排除完全没有地址记录的用户,可以在WHERE里加个AND EXISTS (SELECT 1 FROM Address a WHERE a.pid = p.pid)。

方法3:用EXCEPT(部分数据库支持,如PostgreSQL、SQL Server)

取所有用户,减去已经设置了默认地址的用户,剩下的就是目标:

SELECT * FROM Person
EXCEPT
SELECT p.*
FROM Person p
JOIN Address a ON p.pid = a.pid
WHERE a.is_default = -1

小提醒

如果你的is_default字段的默认标识不是-1(比如用1代表默认),记得把SQL里的=-1改成对应的数值哦~

内容的提问来源于stack exchange,提问作者user565992

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:47:28