2

我有下面列出的两张表。

表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]

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

你能帮我么?

4

2 回答 2

1

我们应该与JOIN同桌并按 分组。然后使用select all from this connection where count of rows = count of rows in 。这意味着这匹配输入列表中的所有项目B@tblDataStudentIdHAVINGStudentID@tblDatastudentId

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 演示

于 2013-08-22T07:05:16.343 回答
0

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

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

于 2013-08-22T07:01:13.563 回答