如何查询sm_user_id=1的用户未加入的站点列表(基于两表关联)
用户未加入站点列表的SQL实现方案
核心筛选逻辑
匹配site_details全量站点,排除所有在site_members表中已经关联sm_user_id = 1的站点记录,三种可直接落地的查询写法如下:
- 写法1:使用
NOT EXISTS子查询(大数据量场景推荐,性能稳定,无额外去重开销)
SELECT sd.site_id, sd.sitename FROM site_details sd WHERE NOT EXISTS ( SELECT 1 FROM site_members sm WHERE sm.sm_site_id = sd.site_id AND sm.sm_user_id = 1 );
- 写法2:使用左连接匹配空值
SELECT DISTINCT sd.site_id, sd.sitename FROM site_details sd LEFT JOIN site_members sm ON sd.site_id = sm.sm_site_id AND sm.sm_user_id = 1 WHERE sm.sm_site_id IS NULL;
注:加DISTINCT是为了规避site_members内重复关联数据带来的结果行重复问题。
- 写法3:使用
NOT IN子查询(需规避空值陷阱)
SELECT site_id, sitename FROM site_details WHERE site_id NOT IN ( SELECT sm_site_id FROM site_members WHERE sm_user_id = 1 AND sm_site_id IS NOT NULL );
注:如果子查询返回的sm_site_id存在NULL值,NOT IN会导致全查询返回空结果,必须在子查询内加上非空判断。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

