[英]Returning child records in a single SQL statement in SQL Server 2008/2012
我现在有一个存储过程下面的SQL语句;
SELECT [Id],
[Path],
[Title],
[Description]
FROM [Configuration].[Pages] p
WHERE
((p.Id = @Id) OR (@Id IS NULL)) AND
((p.Path = @Path) OR (@Path IS NULL))
这使我可以传递页面的路径,页面的ID或什么都不传递(返回全部)。
我希望将其重构为返回相关的子记录(1到M),而不是为返回的每个记录返回数据库。 子记录的当前SQL如下:
SELECT h.Id, h.Description, h.Title, h.[Content]
FROM [Configuration].[HelpItems] h INNER JOIN
[Configuration].[PageHelpItems] ph ON h.Id = ph.HelpId
WHERE (ph.PageId = @PageId)
目前,我正在遍历每个父记录并为每个父记录调用此存储过程,我认为这是效率低下的,我想在SP中使用一个或多个SQL语句来确保为所有父级返回子记录。
尝试使用以下查询:
SELECT h.Id, h.Description, h.Title, h.[Content]
FROM [Configuration].[HelpItems] h INNER JOIN
[Configuration].[PageHelpItems] ph ON h.Id = ph.HelpId
INNER JOIN [Configuration].[Pages] p ON ph.PageId = p.Id
WHERE
((p.Id = @Id) OR (@Id IS NULL)) AND
((p.Path = @Path) OR (@Path IS NULL))
所以你想要记录
;WITH Rec AS (
SELECT [Id],
[Path],
[Title],
[Description]
FROM [Configuration].[Pages] p
WHERE
((p.Id = @Id) OR (@Id IS NULL)) AND
((p.Path = @Path) OR (@Path IS NULL))
)
SELECT 'Main' Which, * FROM Rec
-- plus the children...
UNION ALL
SELECT 'Related', h.Id, h.Title, h.Description, h.[Content]
FROM [Configuration].[HelpItems] h
INNER JOIN [Configuration].[PageHelpItems] ph ON h.Id = ph.HelpId
INNER JOIN Rec ON Rec.Id = ph.PageId
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.