删除后触发超过1个记录

发布于 2025-02-12 19:06:19 字数 1987 浏览 0 评论 0原文

当我删除所有记录时,存在问题。

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;

当我想删除1行时,它可以正常工作,但是对于多行,我会得到此错误:

msg 512,16级,状态1,过程update_stuins_ondelete,第13行
子查询返回超过1个值。当子查询跟随=,!=,<,< = ,,> =或当子查询用作表达式时。

对这个问题有任何建议吗?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

仙女 2025-02-19 19:06:19

如果逻辑中的语句语句,则有三个if(((选择...为null),另一个if(((选择...为null),if(不存在...)<(不存在...)< /code>

在前两个情况下,您正在比较选择语句(返回一组行)与null。您无法将整列与 > NULL 。

<代码

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.

墨落画卷 2025-02-19 19:06:19

这起作用了。

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;

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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文