2010-07-12 64 views
2

我有许多一对多的关系,我在其中查询具有特定的N-所有男,例如:如何高效地反转多对多SQL查询?

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声明。

回答

5

在SQL Server 'NOT EXISTS' 一般more efficient比OUTER JOIN方法。

SELECT M.* FROM M 
WHERE NOT EXISTS 
(SELECT * FROM ManyToManyTable MMT 
      WHERE MMT.M = M.Id AND [email protected]) 
+0

+1。正是我想提出的建议。 – 2010-07-12 11:25:51

+1

最有用的答案。 – Anax 2010-07-12 11:34:01

+0

花了我一段时间,以适应我的确切需求(即 - 转化为NHibernate),但作品非常漂亮!很好的答案! – GeReV 2010-07-12 13:32:49

1

快速和肮脏的:

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