Как эффективно удалить все строки в таблице отношений «многие ко многим», которые имеют заданный пункт назначения исключительно на одной стороне отношения? - PullRequest
1 голос
/ 13 июля 2011

У меня есть база данных MySQL с таблицей отношений, которую можно упростить до:

CREATE TABLE `Paths` (
  `origin` char(32) NOT NULL,
  `destination` char(32) NOT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY  (`id`),
)

Это отношение многие ко многим.Я хочу удалить все пути, где все пути из этого источника ведут только к определенному месту, например, Neverland.

Этот SQL должен работать:

DELETE FROM Paths WHERE origin IN (SELECT DISTINCT origin FROM Paths WHERE destination = 'Neverland') AND origin NOT IN (SELECT DISTINCT origin FROM Paths WHERE destination <> 'Neverland');

Но есть ли лучший, более эффективный способ?

Спасибо!

Ответы [ 3 ]

1 голос
/ 13 июля 2011

Попробуйте:

  Delete Paths
  From Paths p
  Where Not Exists  
      (Select * From paths 
       Where Origin = p.origin
       And Destination <> 'Neverland')
0 голосов
/ 13 июля 2011

Это улучшено:

DELETE FROM Paths WHERE destination= 'Neverland' AND origin NOT IN (SELECT origin FROM Paths WHERE branchto != 'Neverland');

Но я все еще думаю, что это можно сделать лучше.

0 голосов
/ 13 июля 2011

Попробуйте - это как минимум близко.

DELETE Paths
FROM Paths
JOIN Paths AS pd
    ON Paths.origin = pd.destination
WHERE Paths.origin = 'Neverland'

Это второй синтаксис в http://dev.mysql.com/doc/refman/5.0/en/delete.html

...