Есть ли способ объединить логику этих двух операций удаления SQL? - PullRequest
0 голосов
/ 28 марта 2019

Я пишу две операции DELETE в SQL.Первый удаляет запись в базе данных, в которой установлено имя роли студента.Второй удаляет запись с именем null.Мне интересно, могу ли я иметь одну команду SQL, которая может обрабатывать обе логики, или мне нужно хранить их отдельно?

У меня есть 4 таблицы Student, Class, Student_Role и Signup.При удалении ниже будет удалена запись, в которой пользователь предоставляет уникальный идентификатор студента, уникальный идентификатор класса и имя роли студента.

Регистрация содержит 3 столбца (CLASS_ID, STUDENT_ID, STUDENT_ROLE_ID)это все внешние ключи

1st DELETE command:

DELETE S FROM SIGNUP S
INNER JOIN CLASS ON CLASS.ID = S.CLASS_ID
INNER JOIN STUDENT ON STUDENT.ID = S.STUDENT_ID
INNER JOIN STUDENT_ROLE ON STUDENT_ROLE.ID = SDR.STUDENT_ROLE_ID
WHERE CLASS.UNIQUE_ID = :classUniqueId AND
STUDENT.UNIQUE_ID = :studentUniqueId AND STUDENT_ROLE.NAME = :roleName

Но если я передам null для roleName, то этот запрос не будет работать.По сути, мой второй вариант использования - я хочу удалить запись, в которой уникальный идентификатор студента и уникальный идентификатор класса совпадает с тем, что предоставляет пользователь, но имя роли не существует.В данном случае это null.Итак, у меня есть еще один оператор DELETE для этого случая:

2nd DELETE command:

DELETE S FROM SIGNUP S
INNER JOIN CLASS ON CLASS.ID = S.CLASS_ID
INNER JOIN STUDENT ON STUDENT.ID = S.STUDENT_ID
WHERE CLASS.UNIQUE_ID = :classUniqueId AND STUDENT.UNIQUE_ID = :studentUniqueId
AND S.STUDENT_ROLE_ID IS NULL

Теперь мне интересно, смогу ли я объединить эти два в одно утверждение, которое может обработать любое условие (пользователь предоставляет конкретный идентификатор роли студента илиID роли - null). В конце следует удалить только одну запись.Есть ли способ сделать это?

1 Ответ

0 голосов
/ 28 марта 2019

Не уверен, что я вас понял, но, возможно, это то, что вы хотите

DELETE S 
FROM   signup S 
       INNER JOIN class 
               ON class.id = S.class_id 
       INNER JOIN student 
               ON student.id = S.student_id 
       LEFT JOIN student_role 
              ON student_role.id = S.student_role_id 
WHERE  class.unique_id = :classUniqueId 
       AND student.unique_id = :studentUniqueId 
       AND ( ( :roleName IS NULL 
               AND S.student_role_id IS NULL ) 
              OR ( :roleName IS NOT NULL 
                   AND student_role.NAME = :roleName ) )

Изменил STUDENT_ROLE с INNER JOIN на LEFT JOIN, и в предложении where «игнорировать» STUDENT_ROLE.NAME проверяют, если: roleName имеет значение NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...