Ну, запрос SELECT
не собирается ничего удалять, поэтому он ошибается по этой причине.
Я бы попробовал это:
DELETE c FROM child AS c
LEFT OUTER JOIN parent AS w1 ON c.child_id = w1.a_child_id
LEFT OUTER JOIN parent AS w2 ON c.child_id = w2.b_child_id
WHERE w1.a_child_id IS NULL AND w2.b_child_id IS NULL;
Это может показаться страннымприсоединиться к родительской таблице дважды, но, вероятно, она будет лучше использовать индексы (при условии, что у вас есть индексы для a_child_id и b_child_id).
План оптимизации следует проверить с помощью EXPLAIN.Преобразуйте удаление в SELECT и получите план оптимизации:
mysql> explain select c.child_id from child c
left outer join parent w1 on c.child_id = w1.a_child_id
left outer join parent w2 on c.child_id = w2.b_child_id
where w1.a_child_id is null and w2.b_child_id is null\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: c
type: index
possible_keys: NULL
key: PRIMARY
key_len: 8
ref: NULL
rows: 5
Extra: Using index
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: w1
type: ref
possible_keys: ac
key: ac
key_len: 9
ref: test.c.child_id
rows: 1
Extra: Using where; Using index
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: w2
type: ref
possible_keys: bc
key: bc
key_len: 9
ref: test.c.child_id
rows: 1
Extra: Using where; Using index
Когда он говорит «используя индекс», это означает, что он может разрешить доступ к таблице, используя только индекс,без необходимости читать строки таблицы.
Я проверил вышеупомянутое с MySQL 5.5.12, угадывая вашу структуру таблицы из вашего описания.Я создал индекс по одному столбцу для каждого из a_child_id и b_child_id.