SQL Server存储过程优化:如何复用父表ID并规避子查询与左连接?
优化后的存储过程实现方案
首先,完全可以复用第一个查询得到的Id,同时也能避免重复查询a表、子查询以及不必要的左连接,具体优化思路和实现如下:
- 用表变量存储第一个查询的a表结果,后续查询b表时直接调用这个结果集,无需再次查询a表获取Id
- 原第二个查询的左连接属于冗余操作:因为b表的
AId是关联a表主键的外键,且查询条件限定了b.AId匹配目标a表的Id,必然能关联到对应a表记录,因此可以直接从存储的a表结果中获取Name,无需再次关联原a表
优化后的存储过程代码:
CREATE PROCEDURE [dbo].[sp_GetByName] (@name NVARCHAR(255)) AS BEGIN -- 用表变量存储筛选后的a表记录,复用Id和Name DECLARE @filteredA TABLE (Id INT, Name NVARCHAR(255)); INSERT INTO @filteredA SELECT [a].[Id], [a].[Name] FROM [dbo].[a] WHERE [a].[Name] = @name; -- 输出a表筛选结果 SELECT Id, Name FROM @filteredA; -- 输出关联的b表结果,直接关联表变量,避免重复查询和冗余连接 SELECT [b].[Id], [b].[AId], fa.Name FROM [dbo].[b] INNER JOIN @filteredA fa ON [b].[AId] = fa.Id; END;
补充说明
- 原代码中
SELECT TOP(1)存在逻辑漏洞:如果a表存在多条同名记录,只会取第一条的Id,导致丢失其他同名a表对应的b表数据;优化后的代码会返回所有符合条件的关联数据 - 如果
a.Name是唯一约束,表变量只会有一条记录,逻辑依然严谨;如果不唯一,也能正确匹配所有关联关系
内容的提问来源于stack exchange,提问作者truel
相关产品推荐
相关产品推荐

