Хранимая процедура с использованием вложенных запросов для поиска внешних ключей - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь настроить хранимую процедуру, которая может обновлять записи, где может измениться связь внешнего ключа в родительских и дочерних отношениях. Это вредит моему мозгу, поэтому любая помощь будет любезно оценена.

Чтобы упростить задачу, я изменил данные на отношения ученик-класс - поэтому, пожалуйста, не обращайте внимания на тот факт, что пример немного неуместен и плохо спроектирован.

В моей задаче , У меня была бы таблица Classes - и по какой-то причине класс должен дублироваться (см. Таблицу классов):

enter image description here

Вы можете видеть, что добавляется желтый класс INF110, а код предмета остается прежним.

Теперь у меня есть хранимая процедура для добавления учащихся в предмет INF110, и когда это происходит ... если он обнаруживает дублирующий код предмета, он добавляет две записи в таблицу учеников следующим образом:

enter image description here

Как видите, две записи Peter были добавлено в таблицу Student.

Моя проблема заключается в том, что я пытаюсь создать хранимую процедуру для управления обновлениями для учащихся на основе следующих случаев использования;

  1. Необходимо обновить имя студента, где идентификатор студента = A
  2. Необходимо изменить зарегистрированный предмет студента с одного на другой.

Первый вариант использования для поддержки обновления будет выглядеть примерно так:

UPDATE Student
SET ClassId = C.ClassId,
    StudentName = 'Peter James'
FROM
    (SELECT ClassId FROM Student WHERE SubjectCode = @subjectCode) C 
LEFT JOIN
    Student S ON C.ClassId = S.ClassId 
WHERE StudentId = 'A';

Для второго сценария (изменение класса) это будет означать, что ученик А (Питер) хотел бы изменить с INF110 на ACC110. Однако, как вы можете видеть, в этот момент (из-за дублированного класса INF110) он существует дважды в таблице Student. В этом случае запись S2 в Student должна быть удалена, а запись S1 должна быть связана с классом C3 вместо C1.

Любая помощь будет оценена. Я могу добавить свою текущую хранимую процедуру, но чувствую, что она запутает еще больше.

...