INTERSECT&除[SQL Server 2012]之外

时间:2013-11-07 05:30:42

标签: sql-server

我有一个问题,我找不到很好的解决方案。

我的关系表Groups_Members包含GroupId列和MemberId

我有一个存储过程,它创建一个新组并接收一个memberId数组作为参数(用户定义的类型)。我想要的是确保数据库中没有一个具有完全相同成员的组。

我正在试图找出EXCEPT运营商如何帮助我,但我不能。我需要条件,它将返回与我的memberId参数中具有完全相同的成员集的组(如果不存在这样的组,则返回null或0)。

任何帮助都将受到高度赞赏!

谢谢!

2 个答案:

答案 0 :(得分:2)

表格组_成员

GroupId|MemberId
   1   |   1
   1   |   2
   1   |   3
   2   |   1
   2   |   2
   2   |   4
   3   |   1
   3   |   3
   3   |   4
Declare @Members table(id int)
insert into @Members
values(1), (3), (4)

Declare @MemberCount int
Select @MemberCount = count(id) From @Members

Select GroupId from 
(Select distinct groupId, memberid from Groups_Members) gm
Inner Join @Members On MemberId = id
group by GroupId
Having COUNT(MemberId) = @MemberCount

结果将是3

可根据需要提供说明。

答案 1 :(得分:1)

Declare @Members table(id int)
insert into @Members
values(1), (3), (4)

Declare @MemberCount int
Select @MemberCount = count(id) From @Members

--Select GroupId from 
--(Select distinct groupId, memberid from Groups_Members) gm
--Inner Join @Members On MemberId = id
--group by GroupId
--Having COUNT(MemberId) = @MemberCount

当值(1),(3),(4)(它正常工作)时。

但是当值(1),(2)(它不能正常工作)时。

很好的尝试,但它不能提供与小组成员的完全匹配。

试试这个以获得更好的解决方案

Select Gm.GroupId from 
(Select distinct  GroupId, memberid from Groups_Members) gm
Inner Join @Members On MemberId = id
Inner join (Select COUNT(MemberId) as Totalmember,GroupId 
from Groups_Members group by GroupId) tgm on tgm.GroupId = gm.GroupId
where Totalmember = @MemberCount
group by gm.GroupId
Having COUNT(MemberId) = @MemberCount

可根据需要提供说明。