2017-03-13 17 views
0

私はページのリストを持つテーブルを持っていますが、親ページを持つテーブルもあります。これらのページは非常にランダムな順序です。 Page_Orderで注文されたすべてのページを選択するには、再帰的な結合ステートメントを作成する必要があります。ここでは、それぞれの子ページが続きます。注文との再帰的結合

表:ページ

Page_ID | Page_Name | Page_Parent | Page_Order 
1  | User  | 2   | 2 
2  | Admin  | NULL  | 2 
3  | Pages  | 2   | 1 
4  | Home  | NULL  | 1 
5  | About  | NULL  | 3 
6  | Contact | 5   | 1 

私は次の順序でそれらを選択します(それぞれがその子ページに続いて、親ページを発注):

Page_ID | Page_Name | Page_Parent | Page_Order 
4  | Home  | NULL  | 1 
2  | Admin  | NULL  | 2 
3  | Pages  | 2   | 1 
1  | User  | 2   | 2 
5  | About  | NULL  | 3 
6  | Contact | 5   | 1 
+2

ソートの背後にあるロジックについてもう少し詳しくお聞かせください。私はあなたが望む注文をどのようにしているのかはわかりません。 – Siyual

+0

何を試しましたか?どのような研究をしましたか? – HABO

+0

@Siyual親がPage_Order列でソートされるようにします。各親の後に、その子が再度Page_Order列でソートされる必要があります。 –

答えて

2

それはあなたが尋ね、具体的ではありませんしかし、ここであなたが望むものを達成する方法です。これはあなたにも子ページの有限数を制限し、再帰的ではありません。

; WITH cte AS (
    SELECT 1 Page_Id, 'User' Page_Name, 2 Page_Parent, 2 Page_Order union 
    SELECT 2, 'Admin ', NULL, 2 union 
    SELECT 3, 'Pages ', 2 , 1 union 
    SELECT 4, 'Home ', NULL, 1 union 
    SELECT 5, 'About ', NULL, 3 union 
    SELECT 6, 'Contact ', 5 , 1 
) 

SELECT Page_Id, Page_Name, Page_Parent, Page_order, x = CAST(Page_order AS DECIMAL(18,2)) 
FROM cte 
WHERE Page_Parent IS NULL 
UNION 
SELECT child.Page_Id, child.Page_Name, child.Page_Parent, child.Page_order, X = CAST(parent.Page_order AS DECIMAL(18,2)) + ISNULL(CAST(child.Page_order AS DECIMAL(18,2))/10000, 0) 
FROM cte parent 
     LEFT OUTER JOIN cte child 
       ON child.Page_Parent = parent.Page_Id 
WHERE child.Page_Id IS NOT NULL 
ORDER BY x 
+0

奇妙な回避策ですが、問題なく動作します。どうもありがとう! :D –

+0

@スティーブ、興味深い答え。それはまた、10で除算することから始まります。 – Venu