sql - 如何有效地反转多对多 SQL 查询?

标签 sql sql-server t-sql

我有一个多对多关系,其中我查询具有特定 N 的所有 M,例如:

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

我的问题是,如何有效地反转查询,以便获得没有特定 N 的所有 M

也就是说,就像上面的选择中的 NOT IN 一样,但如果可能的话,没有 NOT IN 语句。

最佳答案

在 SQL Server 中,“不存在”通常是 more efficient比 OUTER JOIN 方法。

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

关于sql - 如何有效地反转多对多 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3227986/

相关文章:

mysql - 实现操纵和插入 sql 记录的算法的最快方法是什么?

mysql - 当操作影响集合时更新和删除一组行

sql-server - T-SQL "LineNo"保留字到底有什么作用?

c# - 跨本地数据库使用 INSERT INTO

sql - 当用户未选择参数信息时如何返回表中的所有值

SQL - 如果包含这些其他记录,则包含此记录

sql - 与加入和地点相关的性能

sql-server - 无法加载文件或程序集 'System.Data.SqlServerCE'

sql - 查询根据其他字段用最大值填充Null字段

sql - 使用sql中的case语句获取多行作为输出