多对多关联场景下查询同时属两部门用户的SQL解决方案
如何查询同时属于两个部门的用户?
嘿,我一眼就看出你原来查询的问题啦!你在WHERE里同时要求DP.IDDepartment = 1和DP.IDDepartment = 2,但一条UserDepartment记录只能对应一个部门ID呀,这条件根本不可能满足,所以才返回0条结果~
下面给你几种靠谱的解决方案,按需选择就行:
方法一:分组统计法(灵活适配多部门场景)
这种方法适合需要同时匹配多个部门的情况,逻辑清晰还容易扩展:
SELECT u.ID, u.Name FROM User u JOIN UserDepartment ud ON u.ID = ud.IDUser WHERE ud.IDDepartment IN (1, 2) GROUP BY u.ID, u.Name HAVING COUNT(DISTINCT ud.IDDepartment) = 2;
思路:先筛选出所有关联了目标部门的用户记录,然后按用户分组,统计每个用户关联的不同部门数量。只有数量等于目标部门数(这里是2)的用户,才说明同时属于所有目标部门。加DISTINCT是为了避免中间表存在重复关联记录的情况干扰统计结果。
方法二:多次连接法(直观的交集查询)
如果你只需要匹配两个部门,这种方法更直观,相当于找两个部门用户集合的交集:
SELECT u.ID, u.Name FROM User u JOIN UserDepartment ud1 ON u.ID = ud1.IDUser AND ud1.IDDepartment = 1 JOIN UserDepartment ud2 ON u.ID = ud2.IDUser AND ud2.IDDepartment = 2;
思路:把UserDepartment表连两次,第一次只拉取属于部门1的用户关联,第二次只拉取属于部门2的,只有同时满足两个连接条件的用户才会被保留下来。
方法三:EXISTS子查询法(性能友好的逻辑验证)
这种方法逻辑最直白,而且对于大数据表来说性能通常不错,因为EXISTS只要找到匹配记录就会停止查询:
SELECT u.ID, u.Name FROM User u WHERE EXISTS ( SELECT 1 FROM UserDepartment ud WHERE ud.IDUser = u.ID AND ud.IDDepartment = 1 ) AND EXISTS ( SELECT 1 FROM UserDepartment ud WHERE ud.IDUser = u.ID AND ud.IDDepartment = 2 );
思路:分别检查用户是否存在部门1和部门2的关联记录,只有两个条件都满足的用户才会被选中。如果要加更多部门,直接加新的EXISTS条件就行。
内容的提问来源于stack exchange,提问作者Rafael Rocha




