SQL:多对多表和查询

Roe*_*ler 13 sql many-to-many

首先 - 为模糊标题道歉,我找不到更好的标题.

我有以下结构的表(简化):

EmpID DeptID

1     1
1     2
2     1
3     2
4     5
5     2
Run Code Online (Sandbox Code Playgroud)

此表表示多对多关系.

我有兴趣找到与特定DeptID组相关的所有EmpID,例如我想要所有与DeptID 1,2和3相关的EmpID.请注意它是AND关系而不是OR关系.对于我的情况,EmpID可能与除1,2和3之外的其他DeptID相关,因为它是有效的答案.

我感兴趣的DeptID数量有所变化(即我可能想要与DeptID 3和5相关的EmpID,或者我可能想要与DepID 2,3,4,5,6,7相关的EmpID).

当我尝试解决这个问题时,我发现自己要么每个DepID创建一个JOIN,要么每个DeptID创建一个子查询.这意味着我必须根据我正在测试的DeptID数量生成一个新查询.我显然更喜欢使用参数或参数集进行静态查询.

我正在研究SQL Server和MySQL(并行开发两个版本的代码).

有任何想法吗?

cle*_*tus 14

我假设您想要找到所有指定部门中的员工,而不仅仅是在任何部门中的员工,这是一个更容易查询的问题.

SELECT EmpID
FROM mytable t1
JOIN mytable t2 ON t1.EmpID = t2.EmpID AND t2.DeptID = 2
JOIN mytable t3 ON t2.EmpID = t3.EmpID AND t3.DeptID = 3
WHERE DeptID = 1
Run Code Online (Sandbox Code Playgroud)

我将取代使用聚合的不可避免的建议:

SELECT EmpID
FROM mytable
WHERE DeptID IN (1,2,3)
GROUP BY EmpID
HAVING COUNT(1) = 3
Run Code Online (Sandbox Code Playgroud)

抵制那种诱惑.它明显变慢了.在SQL语句中出现了类似的情况- "加入"与"分组和拥有"并且第二个版本在第二个版本中慢了20倍.

我还建议您查看AppDevelopers制作的数据库开发错误.