Таблица, показанная ниже, отображает отношения между многими и многими между курсами и студентами.Найти сопоставленные группы во многих отношениях Таблица
CREATE Table CourseStudents
(
CourseId INT NOT NULL,
StudentId INT NOT NULL,
PRIMARY KEY (CourseId, StudentId)
);
INSERT INTO CourseStudents VALUES (1, 1), (1, 2), (2, 1), (2, 2), (3, 3), (3, 2),
(4, 3), (4, 2), (5, 1)
Пример данных
| CourseId | StudentId |
|----------|-----------|
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 2 |
| 3 | 2 |
| 3 | 3 |
| 4 | 2 |
| 4 | 3 |
| 5 | 1 |
Я ищу запрос, который возвращает все курсы, которые имеют те же студенты. Я смог придумать запрос, показанный ниже.
WITH CourseGroups AS
(
SELECT c.CourseId,
STUFF ((
SELECT ',' + CAST(c2.StudentId AS VARCHAR)
FROM CourseStudents c2
WHERE c2.CourseId = c.CourseId
ORDER BY c2.StudentId
FOR XML PATH ('')), 1, 1, '') AS StudentList
FROM CourseStudents c
GROUP BY c.CourseId)
SELECT cg.StudentList,
STUFF ((
SELECT ',' + CAST(cg2.CourseId AS VARCHAR(10))
FROM CourseGroups cg2
WHERE cg2.StudentList = cg.StudentList
FOR XML PATH ('')), 1, 1, '') AS ExactMatchCourseList
FROM CourseGroups cg
GROUP BY cg.StudentList
HAVING COUNT(*) > 1
Запрос возвращает
| StudentList | ExactMatchCourseList |
|-------------|----------------------|
| 1,2 | 1,2 |
| 2,3 | 3,4 |
выше результата хорошо. Но мне нужен только ExactMatchCourseList. Таблица, с которой я имею дело, имеет более миллиарда строк, поэтому мне нужен эффективный запрос, который может найти любые согласованные курсы в течение нескольких минут времени выполнения. Цените любую помощь. SqlFiddle
Я отмечаю это как ответ, поскольку мне удалось получить дубликаты курсов в течение приемлемого времени. Однако мне пришлось изменить последний запрос, чтобы вывести список повторяющихся курсов вместе со списком учеников. Благодарю. – ziddarth