У меня есть стол для студентов и стол для курсов. Они имеют много-много отношений между ними, и таблица StudentCourses является посредником. Теперь у меня есть список идентификаторов курсов, и я хочу выбрать студентов, которые следуют всем курсам в моем списке. Как ??
--CREATE TYPE CourseListType AS TABLE
--(
-- CourseID INT
--)
DECLARE
@CourseList CourseListType
CREATE TABLE #Students
(
ID INT
,Name CHAR(10)
)
CREATE TABLE #Courses
(
ID INT
,Name CHAR(10)
)
CREATE TABLE #StudentCourses
(
StudentID INT
,CourseID INT
)
INSERT INTO @CourseList (CourseID)
VALUES
(1) --English
,(2) --Math
INSERT INTO #Students (ID, Name)
VALUES
(1, 'John')
,(2, 'Jane')
,(3, 'Donald')
INSERT INTO #Courses (ID, Name)
VALUES
(1, 'English')
,(2, 'Math')
,(3, 'Geography')
INSERT INTO #StudentCourses (StudentID, CourseID)
VALUES
(1, 1)
,(1, 2)
,(2, 1)
,(2, 2)
,(3, 1)
,(3, 3)
В этом примере я хочу, чтобы результатом были только Джон и Джейн, потому что у них обоих есть два курса в моем CourseList. Я не хочу Дональда, потому что у него есть только один из них.
Попробовал это СОЕДИНЕНИЕ, конструкцию, но это не исключает студентов, у которых есть только некоторые из моих желаемых курсов.
SELECT
*
FROM
@CourseList CRL
INNER JOIN #Courses CRS ON CRS.ID = CRL.CourseID
INNER JOIN #StudentCourses STC ON STC.CourseID = CRS.ID
INNER JOIN #Students STD ON STD.ID = STC.StudentID