Как эффективно инвертировать SQL-запрос «многие ко многим»? - PullRequest
2 голосов
/ 12 июля 2010

У меня есть отношение "многие ко многим", в котором я запрашиваю все М, которые имеют конкретное N , например:

SELECT M.* FROM M INNER JOIN ManyToManyTable
ON M.Id = ManyToManyTable.M
WHERE ManyToManyTable.N = @Id

Или:

SELECT M.* FROM M INNER JOIN ManyToManyTable
ON M.Id = ManyToManyTable.M
INNER JOIN N
ON N.Id = ManyToManyTable.N
WHERE N.Id = @Id

У меня вопрос, как эффективно инвертировать запрос, чтобы я получил все M, которые не имеют определенный N ?

То есть, какNOT IN выбирает выше, но без оператора NOT IN, если возможно.

Ответы [ 2 ]

5 голосов
/ 12 июля 2010

В SQL Server «НЕ СУЩЕСТВУЕТ» обычно более эффективен , чем подход OUTER JOIN.

SELECT M.* FROM M  
WHERE NOT EXISTS
 (SELECT * FROM ManyToManyTable MMT
           WHERE MMT.M = M.Id AND N=@Id )
1 голос
/ 12 июля 2010

Быстро и грязно:

SELECT M.* FROM M
WHERE M.id NOT IN
    (SELECT M.id FROM M INNER JOIN ManyToManyTable
     ON M.Id = ManyToManyTable.M
     WHERE ManyToManyTable.N = @Id)

Лучше:

SELECT M.*
FROM M LEFT JOIN ManyToManyTable
ON M.Id = ManyToManyTable.M
WHERE ManyToManyTable.M IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...