我有两张表,如下所示。
StudentID StudentName
1 A
2 B
3 C
4 D
5 E
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]
不幸的是,上面提到的查询没有返回预期值。
你能帮帮我吗?
答案 0 :(得分:1)
我们JOIN
表B
表@tblData
和StudentId
分组。然后使用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
答案 1 :(得分:0)
关键是,由于您使用B加入@tblData,引擎会将整个表B与@tblData匹配。这样,如果您传递一个输入值列表,您将获得与@tblData中的一个条目匹配的每个学生。
为了避免这种情况,你可以插入一些where / groupby子句,它匹配一个学生的条目数,以及@tblData或子查询中的条目数。