我需要像 -
这样的东西Select * from RoomMemberTable where RoomMemberId "ONLY IN" ('RM1','RM3')
我的表结构 -
RoomId RoomMemberId
R1 RM1
R1 RM2
R1 RM3
R2 Rm1
R2 RM2
R3 RM1
R3 RM3
我需要获得仅包含这些会员的行。除了RM1和RM3之外,我不需要任何其他成员的参赛作品。
答案 0 :(得分:4)
没有确切的操作符,您需要应用更多逻辑,这取决于您的确切需求,但不清楚。手头问题的术语是Relational Division。一种方法是排除有其他房间成员的房间:
SELECT *
FROM #T AS t
WHERE NOT EXISTS
( SELECT 1
FROM #T AS t2
WHERE t2.RoomId = t.RoomId
AND t2.RoomMemberId NOT IN ('RM1', 'RM3')
);
因此,R1
和R2
都会在不存在的子查询中返回记录,因此这些记录将被排除,只留下R3
。
或者,如果您只想要RoomId
,则可以使用GROUP BY
和HAVING
:
SELECT RoomId
FROM #T
GROUP BY RoomId
HAVING COUNT(CASE WHEN RoomMemberId IN ('RM1', 'RM3') THEN 1 END) = COUNT(1);
我用于此的测试表和数据是:
IF OBJECT_ID(N'tempdb..#T', 'U') IS NOT NULL DROP TABLE #T;
CREATE TABLE #T (RoomId VARCHAR(2), RoomMemberId VARCHAR(3));
INSERT #T (RoomId, RoomMemberId)
VALUES
('R1', 'RM1'), ('R1', 'RM2'), ('R1', 'RM3'), ('R2', 'Rm1'),
('R2', 'RM2'), ('R3', 'RM1'), ('R3', 'RM3');
这两个示例都适用于给定会议室必须只有成员RM1
或RM3
的逻辑,他们没有指定他们必须两者。如果您需要,那么您需要:
SELECT RoomId
FROM #T
GROUP BY RoomId
HAVING COUNT(CASE WHEN RoomMemberId IN ('RM1', 'RM3') THEN 1 END) = COUNT(1)
AND COUNT(DISTINCT RoomMemberId) = 2;
答案 1 :(得分:0)
Select * from RoomMemberTable where RoomMemberId IN ('RM1','RM3')
答案 2 :(得分:0)
您也可以使用OR运算符........
Select * from RoomMemberTable where RoomMemberId ='RM1' Or RoomMemberId ='RM3'.
仅当有两个以上的值时才使用In,在这种情况下我更喜欢OR而不是IN
IN :值范围
OR :在一个或其他
中