如何返回User表中无UserDetails匹配或匹配且位置为IND的所有行
解决方案:获取符合条件的User记录
要实现你的需求,我们可以使用LEFT JOIN关联User和UserDetails表,同时通过条件过滤出符合要求的记录。这里有两种直观的写法,都能达成预期效果:
方法一:在JOIN的ON子句中添加过滤条件
这种方式会先对UserDetails表做条件过滤,再和User表做左连接,既能保留没有匹配UserDetails的User记录,也只会留下符合条件的匹配记录。
SELECT u.id, u.name, ud.location FROM User u LEFT JOIN UserDetails ud ON u.id = ud.user_id AND ud.location = 'IND';
方法二:在WHERE子句中明确两种判断情况
如果你更习惯把条件集中在WHERE里,也可以这样写,清晰区分两种符合要求的场景:
SELECT u.id, u.name, ud.location FROM User u LEFT JOIN UserDetails ud ON u.id = ud.user_id WHERE ud.id IS NULL -- 该用户没有对应的UserDetails记录 OR ud.location = 'IND'; -- 有对应记录且满足指定位置条件
结果验证
用你提供的示例数据测试这两个查询,都会得到预期的结果:
| id | name | location |
|---|---|---|
| 1 | Hearaman | null |
| 2 | Ramse | null |
| 4 | Robert | IND |
小提示
千万别直接在WHERE里只写ud.location = 'IND'——这样会把LEFT JOIN中没有匹配的记录(ud字段全为NULL)直接过滤掉,就拿不到id为1和2的用户了。
内容的提问来源于stack exchange,提问作者Hearaman
相关产品推荐
相关产品推荐

