开发者

How do I efficiently inverse a many-to-many SQL query?

I have a many-to-many relationship, in which I query all M which have a specific N, for example:

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

Or:

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

My question is, how to efficiently inverse the query so I get all M which do not have a specific N?

That is, like a NOT IN the selects above, but开发者_Go百科 without the NOT IN statement, if possible.


In SQL Server 'NOT EXISTS' is generally more efficient than the OUTER JOIN approach.

SELECT M.* FROM M  
WHERE NOT EXISTS
 (SELECT * FROM ManyToManyTable MMT
           WHERE MMT.M = M.Id AND N=@Id )


Quick and dirty:

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)

Better:

SELECT M.*
FROM M LEFT JOIN ManyToManyTable
ON M.Id = ManyToManyTable.M
WHERE ManyToManyTable.M IS NULL
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜