2010-07-12 61 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