2012-09-19 102 views
0

我目前在存儲過程中有以下SQL語句;在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語句所有家長都會返回記錄。

+0

你期運用哪個RDBMS? SQL Server?哪個版本?樹能夠遞減多少層?你聽說過遞歸CTE嗎? –

+0

SQL Server 2008/2012。只有一個遞歸級別。 – ChrisBint

+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 
+0

嘗試更改此項時出現以下錯誤;所有使用UNION,INTERSECT或EXCEPT運算符組合的查詢在目標列表中必須具有相同數量的表達式。 – ChrisBint

+0

對不起 - 更正。我讀錯了列。對於子記錄,您將在「路徑」下獲得標題,在「標題」下描述,在「描述」下顯示內容。 – RichardTheKiwi

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)) 
+0

問題在於它會爲具有多個子記錄的每個父項返回多個記錄。我希望不必在消費者身上過濾這些東西。 – ChrisBint

+0

如果您將使用PageId或Path搜索頁面,它將僅爲每位父母提供該父項的子項記錄。但是如果你不提供其中的任何一個,那麼它將爲每個父母返回多個子記錄。 – Nitesh

相關問題