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

SQL如何先通过WHERE过滤关联表数据,再对结果执行二次筛选

你原来的写法存在逻辑错误:WHERE子句的过滤是在左连接执行完成后才生效的,将user_profiles.type = 1放在WHERE中时,左连接生成的、user_profiles字段全为NULL的行就会被过滤,最终结果不符合预期。

你要的需求可以在单条SQL中实现,常用的有两种写法:

方案1:将类型过滤条件放在LEFT JOIN的ON子句中

ON子句的过滤条件会在表关联动作执行时生效,关联阶段就只会匹配type = 1的user_profiles记录,之后再过滤关联结果为空的行,就是没有创建类型为1的资料的用户:

SELECT * FROM users 
LEFT JOIN user_profiles
ON users.id = user_profiles.user_id AND user_profiles.type = 1
WHERE user_profiles.user_id IS NULL

方案2:使用NOT EXISTS子查询

如果你不需要返回user_profiles表的字段,更推荐这种写法,语义更清晰,也不会出现多对一关联产生的重复行问题:

SELECT * FROM users
WHERE NOT EXISTS (
    SELECT 1 FROM user_profiles 
    WHERE user_profiles.user_id = users.id AND user_profiles.type = 1
)

以上两种写法返回的结果完全一致,你可以根据自己的场景选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:45:02