Извините, если это где-то дубликат, поиск здесь и в Интернете, похоже, имеют схожие, но не точные совпадения с моей проблемой, поэтому я решил опубликовать.
Я называю это полностью рекурсивной группировкой в отношениях «многие ко многим».Я попытался написать соединения и ctes, чтобы сделать это, но без полной рекурсии я получаю только один уровень глубины, и я не очень рад пытаться писать вложенные динамические курсоры.
Предположим, что выражения могут быть получены изэта таблица «соединения», чтобы найти отдельных студентов / классов, поэтому вопрос может быть обобщен с использованием только одного набора.
SELECT * FROM student_class
+-------------+----------+--------------+
| student_id | class_id | group_number |
+-------------+----------+--------------+
| 1 | A | null |
| 1 | C | null |
| 2 | A | null |
| 2 | B | null |
| 2 | C | null |
| 3 | E | null |
| 4 | B | null |
| 4 | F | null |
+-------------+----------+--------------+
Вопрос в том, как заполнить номер группы посредством рекурсивных отношений для каждого учащегося и для каждого класса.Пример: если student_id 1 имеет class_id A, то какие еще студенты имеют class_id A?Для тех других учеников, какие у них другие классы?Для каждого из тех других классов, какие другие студенты имеют эти классы?Затем продолжайте повторять результаты до тех пор, пока не будет найдено никаких зависимостей.
Так что в этом примере окончательное обновление будет содержать только две группы, читайте так, поскольку ни у одного из учеников нет class_id C, а student_id 3 не имеет других классов:
+-------------+----------+--------------+
| student_id | class_id | group_number |
+-------------+----------+--------------+
| 1 | A | 1 |
| 1 | C | 1 |
| 2 | A | 1 |
| 2 | B | 1 |
| 2 | C | 1 |
| 3 | E | 2 |
| 4 | B | 1 |
| 4 | F | 1 |
+-------------+----------+--------------+