2012-01-17 13 views
4

階層IDで階層内のSQLデータを並べ替えることはできますか?Sql階層IDレベル別並べ替え

私たちは、従業員IDに基づいて組織階層を示しています従業員表を持ってそう言う

あなたはボブが(5)フィル(17)とチャーリー(28)を持っている人は彼への報告、およびジョージー持っている(6 )はタイラー(15歳)とマイク(56歳)を彼女に報告している。

あなたはそれが次のようになりますhierarchyid型で、それを並べ替える場合:

ボブ(/ 5 /)
--Phil(/ 5/17 /)
--Charlie(/ 5月28日/)
ジョージー(/ 6 /)
--Tyler(/ 6/15 /)
--Mike(/ 56分の6 /)

しかし、それはおそらく、それが

のように見える持っているより多くの意味になるだろう

ボブ
ジョージー
--Mike
--Tyler

--Phil--Charlie
は、これはあまりにも複雑取得せずに可能ですか?

答えて

0

私が何か誤解していない限り、ORDER BY句にセカンダリソートフィールドを追加することができます。例:

+3

二次を見つけたのですか?関係があればアルファベット順にソートします。これらのすべてのエントリは一意のHiearchyIDを持つので、2番目の並べ替えは私が考えないものには影響しません。 –

+0

はい、申し訳ありませんが誤解されています。あなたの質問にテーブル定義を列挙できますか? HierarchyIDはスラッシュで区切られた各レベルを連結する文字列ですか? ManagerIDフィールドはありますか? –

+0

これはちょっとした例でした。実際の例はメニューです(従業員がもっと理解しやすいと思っていました)。重要なフィールドはDescription(varchar)およびMenuHierarchy(hierarchyID) –

2

- これは動作しますか?これはSorting tree with other column in SQL Server 2008

DECLARE @table TABLE (id INT NOT NULL PRIMARY KEY, name NVARCHAR(4000) NOT NULL, path HIERARCHYID) 

INSERT 
INTO @table 
VALUES 
     (1, 'People', '/'), 
     (2, 'Girls', '/1/'), 
     (3, 'Boys', '/2/'), 
     (4, 'Zoey', '/1/1/'), 
     (5, 'Kate', '/1/2/'), 
     (6, 'Monica', '/1/3/'), 
     (7, 'Mark', '/2/1/'), 
     (8, 'David', '/2/2/') 

;WITH q AS 
     (
     SELECT *, HIERARCHYID::Parse('/') AS newpath 
     FROM @table 
     WHERE path = HIERARCHYID::GetRoot() 
     UNION ALL 
     SELECT t.*, HIERARCHYID::Parse(q.newpath.ToString() + CAST(ROW_NUMBER() OVER (ORDER BY t.name) AS NVARCHAR(MAX)) + '/') 
     FROM q 
     JOIN @table t 
     ON  t.path.IsDescendantOf(q.path) = 1 
       AND t.path.GetLevel() = q.path.GetLevel() + 1 
     ) 
SELECT replicate(convert(nvarchar, '-'), q.path.GetLevel()) + q.name /*+ '(' + q.newpath.ToString() + ')'*/ 
FROM q 
ORDER BY 
     newpath 
+0

です。今現在最も深いレベルは4ですが、もし私たちが本当に欲しければ400になるかもしれませんが、誰が400レベルのメニューを聞いたことがありますか? –

2

これから取得され、ソリューション私はそれがタイブレークではありませんで

declare @oldId hierarchyid, @newId hierarchyid, @parent hierarchyid 

select @oldId = id_node, @parent = id_node.GetAncestor(1) 
from gbs.T_Hierarchy_Activities ha 
where ID = @ID_Object 

select @newId = @oldId.GetReparentedValue(@oldId, ID_Node) from (
    select row_number() over(order by id_node) rn, id_node 
    from gbs.T_Hierarchy_Activities ha 
     cross join (select * from common.FX_Permissions() where ID_Feature = 10) p 
    where ID_Node.IsDescendantOf(@oldId.GetAncestor(1)) = 1 
     and ID_Level = @oldId.GetLevel() 
     and ha.ID_Office = p.ID_Office 
) a 
where rn = @NewPosition 

update gbs.T_Hierarchy_Activities 
set ID_Node = case when ID_Node = @oldId then @newId else @oldId end 
where ID_Node in (@oldId, @newId) 
関連する問題