2017-04-21 76 views
0

在SQL Server中,我有以下情況:過濾遞歸SQL查詢相交的可能,並choosen項目

  1. 選項和相關羣體:

    Groups(Id, Description) 
    Options(Id, GroupId, Description) 
    
  2. 節點配置了選項:

    Nodes(Id, ParentNodeId, Description) 
    Configurations(Id, NodeId, OptionId) 
    

因此,一個節點可以有一個或多個選項,但一個每組

  • 用戶選擇:

    Choices (Guid, OptionId) 
    
  • 在輸出I想有節點,以遞歸方式,配置選擇選項。 例如:

    Groups 
    1, "Eyes Color" 
    2, "Hair Color" 
    Options 
    1, 1, "Blue" 
    2, 1, "Brown" 
    3, 2, "Blonde" 
    4, 2, "Black" 
    Nodes 
    1, NULL, "Elizabeth" 
    2, NULL, "John" 
    Configurations 
    1, 1, 1 --(Elizabeth, Blue) 
    1, 1, 3 --(Elizabeth, Blonde) 
    2, 1, 4 --(John, Black) 
    

    可能的選擇:

    Eyes Color: NULL -- it means there isn't record in choices table for this option 
    Hair Color: NULL 
    Result: Elizabeth, John 
    Eyes Color: "Blue" 
    Hair Color: NULL 
    Result: Elizabeth, John 
    Eyes Color: "Brown" 
    Hair Color: NULL 
    Result: John 
    Eyes Color: NULL 
    Hair Color: "Blonde" 
    Result: Elizabeth 
    Eyes Color: NULL 
    Hair Color: "Black" 
    Result: John 
    Eyes Color: "Blue" 
    Hair Color: "Black" 
    Result: John 
    Eyes Color: "Blue" 
    Hair Color: "Blonde" 
    Result: Elizabeth 
    Eyes Color: "Brown" 
    Hair Color: "Blonde" 
    Result: - 
    Eyes Color: "Brown" 
    Hair Color: "Black" 
    Result: John 
    

    我的第一個問題是過濾。第二個問題是在遞歸中過濾不分析節點是否包含節點的子節點。

    遞歸:

    with livelliRec 
    as 
    (
        select 
        0 as level, nodeid, parentid 
        from nodes 
    
        union all 
    
        select 
        livellirec.level+1, nodes.nodeid, nodes.parentid 
        from nodes 
        join livelliRec on nodes.parentid = livellirec.nodeid 
    ) 
    

    我發現了一個可能的解決方案列出所有可能的項目,當一個節點未配置爲組,然後驗證所有choosen項目在可能的項目。但如何編寫查詢來執行它?

    在此先感謝。

    +0

    是否應父節點被選擇? –

    +0

    是的,它可以。每個節點都可以配置。這是錯誤的,相反:我不包括不包含父節點的孩子 – Emanuele

    回答

    0

    在我的例子,如果節點未配置爲組,它會被選中:如果子節點沒有choosen

    ;WITH Filtered AS (
        SELECT N.Id, N.ParentId 
        FROM nodes N 
        WHERE NOT EXISTS (
         SELECT 1 
         FROM configurations  C 
         INNER JOIN Options  C_OP ON C_OP.OptionId = C.OptionId 
         INNER JOIN Options  CH_OP ON CH_OP.GroupId = C_OP.GroupId 
         INNER JOIN Choises  CH ON CH.OptionId = CH_OP.OptionId 
         WHERE C.NodeId = N.Id AND CH.OptionId <> C.OptionId 
        ) 
    ), cte AS (
        SELECT 0 AS Level, Id, ParentId 
        FROM Filtered 
        WHERE ParentId IS NULL 
    
        UNION ALL 
    
        SELECT cte.Level + 1 AS Level, Id, ParentId 
        FROM Filtered F 
        INNER JOIN cte ON F.ParentId = cte.Id 
    ) 
    SELECT DISTINCT cte.Id 
    FROM cte 
    
    +0

    首先感謝您的幫助。我正在閱讀解決方案,正如我所說,我的第一個問題是如何過濾。你選擇了OR條件。我會問什麼情況發生 眼睛顏色:「棕色」 髮色:「金髮」 結果: - ?也許結果將是「伊麗莎白」? – Emanuele

    +0

    呵呵,我現在明白了這個問題... –

    +0

    我現在就試試。我編輯了我的第一篇文章,在選項表中解釋NULL。你可以編輯你的答案考慮Choices as table嗎?再次感謝 – Emanuele