SQL 错误 (1093) 您不能在带有子查询的 FROM 子句中为更新指定目标 table

SQL Error (1093) You can't specify target table for update in FROM clause with subqueries

有一个存储过程非常有用!

DELIMITER //
CREATE PROCEDURE temp
(
IN `valcat` INT,
IN `valsubcat` INT
)

BEGIN

DECLARE tcount INT;

SELECT COUNT(*) INTO tcount
FROM subcat sz
WHERE sz.cat_id = valcat;
CASE
    WHEN tcount > 1 THEN
        DELETE sy
        FROM subcat sy
        WHERE sy.sub_id = valsubcat;
    ELSE
        DELETE sx, c
        FROM subcat sx, cat_name c
        WHERE sx.sub_id = valsubcat AND c.cat_id = valcat;
END CASE;

END //

DELIMITER ;

CALL temp(7, 14);

现在我想删除 'valcat' 参数并用来自另一个 table 的子查询替换它。我用这种方式重写了我的存储过程:

DELIMITER //
CREATE PROCEDURE temp
(
IN `valsubcat` INT
)

BEGIN

DECLARE tcount INT;

SELECT COUNT(*) INTO tcount
FROM subcat sz
WHERE sz.cat_id = (SELECT sw.cat_id
                    FROM subcat sw
                    WHERE sw.sub_id = valsubcat);
CASE
    WHEN tcount > 1 THEN
        DELETE sy
        FROM subcat sy
        WHERE sy.sub_id = valsubcat;
    ELSE
        DELETE sx, c
        FROM subcat sx, cat_name c
        WHERE sx.sub_id = valsubcat AND c.cat_id = (SELECT sv.cat_id
                                                    FROM subcat sv
                                                    WHERE sv.sub_id = valsubcat);
END CASE;

END //

DELIMITER ;

CALL temp(14);

...但现在我收到消息:

''SQL Error (1093) in statement #3: You can't specify target table 'sx' for update in FORM clause''

P.S。我还有一个额外的问题:使用程序的第二个变体时性能会降低吗?

DELETE sx, c
FROM subcat sx, cat_name c
WHERE sx.sub_id = valsubcat AND c.cat_id = (SELECT sv.cat_id
                                            FROM subcat sv
                                            WHERE sv.sub_id = valsubcat);

是错误的,必须替换为

DELETE sx, c
FROM subcat sx
JOIN cat_name c ON sx.sub_id = valsubcat
JOIN subcat sv ON c.cat_id = sv.cat_id AND sv.sub_id = valsubcat;