微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL:多对多表和查询

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

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

EmpID DeptID

1     1
1     2
2     1
3     2
4     5
5     2

该表表示多对多关系.

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

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

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

我正在处理sql Server和MysqL(并行开发我的代码的两个版本).

有任何想法吗?

解决方法

我假设你想找到所有指定部门的员工,而不仅仅是在任何部门的员工,这是一个更容易的查询.
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

我将抢占将要使用汇总的不可避免的建议:

SELECT EmpID
FROM mytable
WHERE DeptID IN (1,2,3)
GROUP BY EmpID
HAVING COUNT(1) = 3

抵制诱惑.这显着慢了类似的情况在SQL Statement – “Join” Vs “Group By and Having”年出现,第二个版本是第二个版本,在第二个版本中,大约减慢了二十倍.

我也建议你看看Database Development Mistakes Made by AppDevelopers.

原文地址:https://www.jb51.cc/mssql/81146.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐