There is a problem when I delete all records.
CREATE OR ALTER TRIGGER update_StuIns_OnDelete
ON Class
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Instructor_ID TABLE (id BIGINT);
INSERT INTO @Instructor_ID
SELECT prevC.c_InstructorID
FROM deleted prevC
DECLARE @Institute_ID TABLE (id BIGINT);
INSERT INTO @Institute_ID
SELECT prevC.c_InstituteID
FROM deleted prevC
DECLARE @Instrument_ID TABLE (id BIGINT);
INSERT INTO @Instrument_ID
SELECT prevC.c_InstrumentID
FROM deleted prevC
DECLARE @Student_Id TABLE (id BIGINT);
INSERT INTO @Student_Id
SELECT prevC.c_StudentID
FROM deleted prevC
IF ((SELECT Learning_Time FROM Is_Learning
WHERE l_StudentID IN (SELECT id FROM @Student_Id)
AND l_InstrumentID IN (SELECT id FROM @Instrument_ID)) IS NULL)
BEGIN
DELETE Is_Learning
WHERE l_StudentID IN (SELECT id FROM @Student_Id)
AND l_InstrumentID IN (SELECT id FROM @Instrument_ID)
END
IF((SELECT Teaching_Time FROM Teaches
WHERE t_InstructorID IN (SELECT id FROM @Instructor_ID)
AND t_InstrumentID IN (SELECT id FROM @Instrument_ID)) IS NULL)
BEGIN
DELETE Teaches
WHERE t_InstructorID IN (SELECT id FROM @Instructor_ID)
AND t_InstrumentID IN (SELECT id FROM @Instrument_ID)
END
IF(NOT EXISTS(SELECT * FROM Class C
WHERE C.c_InstructorID IN (SELECT id FROM @Instructor_ID)
AND C.c_InstituteID IN (SELECT id FROM @Institute_ID)))
BEGIN
DELETE Is_MemberOf
WHERE m_InstructorID IN (SELECT id FROM @Instructor_ID)
AND m_InstituteID IN (SELECT id FROM @Institute_ID)
END
END;
When I want to delete 1 row, it works correctly, but for multiple rows, I get this error:
Msg 512, Level 16, State 1, Procedure update_StuIns_OnDelete, Line 13
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Any suggestion for this problem?
CodePudding user response:
You have three if
statements in your logic. if ((select ... is null)
, another if ((select ... is null
, and an if (not exists ...)
In the first two cases, you are comparing the result of a select
statement (which returns a set of rows) against null
. But null is a single scalar. You can't compare a whole column against null
.
Change those two to match the not exists
construction of the third if
.
CodePudding user response:
This worked correctly.
CREATE OR ALTER TRIGGER update_StuIns_OnDelete ON Class
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
IF(EXISTS(SELECT Learning_Time FROM Is_Learning INNER JOIN
deleted d ON l_StudentID = d.c_StudentID AND l_InstrumentID = d.c_InstrumentID
WHERE Learning_Time IS NULL))
BEGIN
DELETE Is_Learning
FROM Is_Learning INNER JOIN
deleted d ON l_StudentID = d.c_StudentID AND l_InstrumentID = d.c_InstrumentID
END
IF(EXISTS(SELECT Teaching_Time FROM Teaches INNER JOIN
deleted d ON t_InstructorID = d.c_InstructorID AND t_InstrumentID = d.c_InstrumentID
WHERE Teaching_Time IS NULL))
BEGIN
DELETE Teaches
FROM Teaches INNER JOIN
deleted d ON t_InstructorID = d.c_InstructorID AND t_InstrumentID = d.c_InstrumentID
END
IF(NOT EXISTS(SELECT * FROM Class C INNER JOIN deleted d
ON C.c_InstructorID = d.c_InstructorID AND C.c_InstituteID = d.c_InstituteID))
BEGIN
DELETE Is_MemberOf
FROM Is_MemberOf INNER JOIN
deleted d ON m_InstructorID = d.c_InstructorID AND m_InstituteID = d.c_InstituteID
END
END;