0

現在、ストアド プロシージャに次の 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、または何も渡さない (すべてを返す) ことができます。

返されたレコードごとに DB に戻るのではなく、関連する子レコード (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 を使用して 1 つ以上の SQL ステートメントを作成したいと考えています。

4

2 に答える 2

0

だからあなたはレコードが欲しい

;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
于 2012-09-19T13:45:27.713 に答える
0

次のクエリを使用してみてください。

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))
于 2012-09-19T13:25:32.230 に答える