是否有像"只有IN"在SQL Server中?

时间:2016-07-22 09:04:58

标签: sql sql-server

我需要像 -

这样的东西
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之外,我不需要任何其他成员的参赛作品。

3 个答案:

答案 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')
        );

因此,R1R2都会在不存在的子查询中返回记录,因此这些记录将被排除,只留下R3

或者,如果您只想要RoomId,则可以使用GROUP BYHAVING

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');

这两个示例都适用于给定会议室必须只有成员RM1RM3的逻辑,他们没有指定他们必须两者。如果您需要,那么您需要:

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 :在一个或其他

相关问题