繁体   English   中英

在SQL Server 2008/2012中的单个SQL语句中返回子记录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM