sql-server – 使用LEFT JOIN或NOT EXISTS之间的最佳实践
发布时间:2020-12-25 20:37:01 所属栏目:MsSql教程 来源:网络整理
导读:使用LEFT JOIN或NOT EXISTS格式之间是否有最佳实践? 使用一个而不是另一个有什么好处? 如果没有,哪个应该是首选? SELECT *FROM tableA ALEFT JOIN tableB B ON A.idx = B.idxWHERE B.idx IS NULL SELECT *FROM tableA AWHERE NOT EXISTS(SELECT idx FROM t
使用LEFT JOIN或NOT EXISTS格式之间是否有最佳实践? 使用一个而不是另一个有什么好处? 如果没有,哪个应该是首选? SELECT * FROM tableA A LEFT JOIN tableB B ON A.idx = B.idx WHERE B.idx IS NULL SELECT * FROM tableA A WHERE NOT EXISTS (SELECT idx FROM tableB B WHERE B.idx = A.idx) 我在Access中使用SQL Server数据库中的查询. 解决方法最大的区别不在于连接vs不存在,它是(如编写的)SELECT *.在第一个示例中,您将获得A和B中的所有列,而在第二个示例中,您只获得A中的列. 在SQL Server中,第二个变体在一个非常简单的设计示例中稍快一些: 创建两个示例表: CREATE TABLE dbo.A ( A_ID INT NOT NULL PRIMARY KEY CLUSTERED IDENTITY(1,1) ); CREATE TABLE dbo.B ( B_ID INT NOT NULL PRIMARY KEY CLUSTERED IDENTITY(1,1) ); GO 在每个表中插入10,000行: INSERT INTO dbo.A DEFAULT VALUES; GO 10000 INSERT INTO dbo.B DEFAULT VALUES; GO 10000 从第二个表中删除每第5行: DELETE FROM dbo.B WHERE B_ID % 5 = 1; SELECT COUNT(*) -- shows 10,000 FROM dbo.A; SELECT COUNT(*) -- shows 8,000 FROM dbo.B; 执行两个测试SELECT语句变体: SELECT * FROM dbo.A LEFT JOIN dbo.B ON A.A_ID = B.B_ID WHERE B.B_ID IS NULL; SELECT * FROM dbo.A WHERE NOT EXISTS (SELECT 1 FROM dbo.B WHERE b.B_ID = a.A_ID); 执行计划: 第二个变体不需要执行过滤操作,因为它可以使用左反半连接运算符. (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读