Fun с MySQL - Как написать оператор удаления с IN - PullRequest
3 голосов
/ 19 ноября 2011

Когда я пытаюсь

DELETE FROM `TreePaths` WHERE `descendant` IN (SELECT `descendant` FROM `TreePaths` WHERE `ancestor`= 0x04);

, я получаю

# 1093 - Вы не можете указать целевую таблицу TreePaths для обновления в предложении FROM

Как получить удаление на работу?

обновление: Структура таблицы:

CREATE TABLE TreePaths (
    ancestor        VARBINARY(16) NOT NULL,
    descendant      VARBINARY(16) NOT NULL,
    PRIMARY KEY (`ancestor`, `descendant`),
    FOREIGN KEY (`ancestor`) REFERENCES Library(iD),
    FOREIGN KEY (`descendant`) REFERENCES Library(iD)
);

Данные таблицы:

ancestor    descendant
        01  01
        02  02
        02  03
        03  03
        02  04
        04  04
        02  05
        04  05
        05  05
        02  06
        04  06
        06  06
        07  07
        08  08
        09  09
        10  10

Ответы [ 2 ]

3 голосов
/ 19 ноября 2011

В MySQL проще сделать удаление из нескольких таблиц:

DELETE paths_to_subtree FROM `TreePaths` AS paths_to_subtree
JOIN `TreePaths` AS subtree USING (`descendant`)
WHERE subtree.`ancestor`= 0x04;
0 голосов
/ 19 ноября 2011

Вы можете создать временную таблицу для хранения потомков:

CREATE TEMPORARY TABLE tmpTable (descendants VARBINARY(16) NOT NULL);
INSERT INTO tmpTable(descendants) (SELECT descendant FROM TreePaths WHERE ancestor = 0x04);
DELETE FROM TreePaths WHERE descendant IN (SELECT descendant from tmpTable);
DROP TABLE tmpTable;

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

...