Как удалить запись, найденную при левом соединении - PullRequest
3 голосов
/ 04 ноября 2011

С помощью следующего запроса я могу найти данные, которые хочу удалить:

SELECT ab.id, ab.anlage_id, a.id
FROM `anlagetobedienung` AS ab
LEFT JOIN anlage_new AS a ON ab.`anlage_id` = a.id
WHERE a.id IS NULL

Как мне написать оператор DELETE, который удаляет найденные записи в таблице anlagetobedienung?

Ответы [ 5 ]

4 голосов
/ 04 ноября 2011
DELETE ab
FROM `anlagetobedienung` AS ab 
LEFT JOIN anlage_new AS a ON ab.`anlage_id` = a.id 
WHERE a.id IS NULL 
0 голосов
/ 04 ноября 2011

Вы можете просто сделать:

DELETE FROM anlagetobedienung ab
 WHERE NOT EXISTS (SELECT NULL
                     FROM anlage_new a
                    WHERE a.id = ab.anlage_id
                  )
0 голосов
/ 04 ноября 2011

Другое возможное решение:

DELETE FROM anlagetobedienung A
WHERE
    NOT EXISTS (SELECT * FROM anlage_new AN WHERE AN.id = A.anlage_id)

Если MySQL поддерживает псевдонимы в DELETE FROM (поддерживается в MS SQL, но я знаю, что некоторые основные РСУБД не поддерживают это), то вы можете сделать:

DELETE ab
FROM
    anlagetobedienung AS ab
LEFT JOIN anlage_new AS a ON
    ab.anlage_id = a.id
WHERE
    a.id IS NULL
0 голосов
/ 04 ноября 2011
DELETE FROM anlagebedienung aDEL WHERE aDEL.id IN 
 (SELECT ab.id 
  FROM `anlagetobedienung` AS ab
  LEFT JOIN anlage_new AS a ON ab.`anlage_id` = a.id
  WHERE a.id IS NULL )
0 голосов
/ 04 ноября 2011

Обычно я бы сказал:

delete anlage_new 
where id in (
    SELECT  a.id
    FROM `anlagetobedienung` AS ab
    LEFT JOIN anlage_new AS a ON ab.`anlage_id` = a.id
    WHERE a.id IS NULL
)

т.е. Вы удаляете строки, в которых первичный ключ находится в результате выбора, который идентифицирует записи для удаления.

Но согласно вашему запросу у них есть id = NULL, что, кажется, не имеет никакого смысла.

Можете ли вы привести пример данных?

После вашего редактирования я бы сказал, что это должно работать:

delete `anlagetobedienung` 
where id in (
    SELECT  ab.id
    FROM `anlagetobedienung` AS ab
    LEFT JOIN anlage_new AS a ON ab.`anlage_id` = a.id
    WHERE a.id IS NULL
)

Примечание: внутренний выбор имеет «ab.id» вместо «a.id», который представляется единственным столбцом в исходном выборе, который может содержать что-то полезное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...