SQL Server:匹配列表中所有值的结果

时间:2013-08-22 06:37:17

标签: sql

我有两张表,如下所示。

表A

StudentID   StudentName
1           A
2           B
3           C
4           D
5           E

表B

StudentID  ClassID  SectionID
1          2        5
3          2        7

现在我正在尝试检索输入列表中所有项目都匹配的学生。

例如,如果我将输入列表(ClassID& SectionID)作为(2,5)传递,它应该返回StudentID:1
如果我将输入列表作为(2,5 | 1,1)传递,则不应返回StudentID:1

DECLARE @tblData AS TABLE
(
     [ClassID]      INT
    ,[SectionID]    INT

)

INSERT INTO @tblData VALUES (2, 5)
INSERT INTO @tblData VALUES (2, 1)

SELECT
     A.[StudentID]
    ,A.[StudentName]
    ,B.[ClassID]
    ,B.[SectionID]
FROM
    [AAAAAA] AS A
        INNER JOIN [BBBBBB] AS B
            ON A.[StudentID] = B.[StudentID]
        INNER JOIN @tblData AS C
            On B.[ClassID] = C.[ClassID] AND B.[SectionID] = C.[SectionID]

不幸的是,上面提到的查询没有返回预期值。

你能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

我们JOINB@tblDataStudentId分组。然后使用HAVING从此连接中选择所有StudentID,其中行数= @tblData中的行数。这意味着此studentId匹配输入列表中的所有项目

SELECT
     A.[StudentID]
    ,A.[StudentName]
    ,B.[ClassID]
    ,B.[SectionID]
FROM  A
     INNER JOIN B
            ON A.[StudentID] = B.[StudentID]
     INNER JOIN 
       (
          SELECT StudentID FROM @tblData
                           JOIN B ON  @tblData.ClassID=B.ClassID 
                                      AND 
                                      @tblData.SectionID=B.SectionID
          GROUP BY StudentID
          HAVING COUNT(*) = (SELECT COUNT(*) FROM @tblData)
) AS T1 on A.StudentID=T1.StudentID

SQLFiddle demo

答案 1 :(得分:0)

关键是,由于您使用B加入@tblData,引擎会将整个表B与@tblData匹配。这样,如果您传递一个输入值列表,您将获得与@tblData中的一个条目匹配的每个学生。

为了避免这种情况,你可以插入一些where / groupby子句,它匹配一个学生的条目数,以及@tblData或子查询中的条目数。