2011-03-18 14 views
6

मुझे मेनू के लिए पदानुक्रम और उपयोगकर्ता राइट्स में कोई समस्या है। मैं केवल उपयोगकर्ता को स्तर 4 के लिए अधिकार देना चाहता हूं उदाहरण के लिए और मेरी क्वेरी को स्वचालित रूप से स्तर 4 बच्चे से सभी अभिभावकों का चयन करना चाहिए। यह कैसे करें?पदानुक्रम एक बच्चे से सभी माता-पिता कैसे प्राप्त करें

क्या आप मेरी समस्या को समझते हैं? मैं बस एक बच्चे से सभी माता-पिता (पूर्वजों) चाहता हूँ।

स्वागत करती है मैनुएल

+0

यह सवाल भी यहाँ उत्तर दिया गया है, और एक नहीं बल्कि दिलचस्प साइमन इन्स द्वारा सुझाए गए दृष्टिकोण है। http://stackoverflow.com/questions/3119860/how-do-you-get-all-ancestors-of-a-node-using-sql-server-2008-hierarchyid चीयर्स, – Eric

+0

आपको तालिका से कॉलम देना चाहिए कुछ नमूना डेटा के साथ और फिर आउटपुट के रूप में आप जो हासिल करना चाहते हैं उसे प्रदान करें। इससे लोगों को बेहतर उत्तर देने में मदद मिलेगी। इसके अलावा, अगर आप पहले से ही कुछ कोशिश कर चुके हैं तो आपको SQL कोड देना चाहिए। – JamieSee

उत्तर

1

की सुविधा देता है मान लेते हैं तो आप इस तालिका है:

CREATE TABLE Hierarchy 
(
    CompanyNode hierarchyid NOT NULL, 
    CompanyId int NOT NULL, 
    NodeLevel AS CompanyNode.GetLevel() 
    CONSTRAINT PK_Hierarchy PRIMARY KEY NONCLUSTERED (CompanyNode) 
) 

और आप इसे पॉप्युलेट तो यह इस डेटा पकड़:

CompanyNode CompanyId NodeLevel 
0x 1 0 
0x58 2 1 
0x5AC0 3 2 
0x68 100 1 
0x6AC0 101 2 
0x6AD6 1000 3 
0x6AD6B0 10000 4 
0x78 20 1 
0x7AC0 200 2 
0x7AD6 2000 3 
0x7AD6B0 20000 4 
0x7AD6B580 200000 5 
0x7AD6D0 20001 4 
0x7ADA 2001 3 
0x7ADE 2002 3 
0x7B40 201 2 
0x7BC0 202 2 

और अब आप सभी माता पिता प्राप्त करना चाहते हैं CompanyId 20001 का, इस तरह मैंने यह किया:

DECLARE @currentLevel smallint 

SELECT @currentLevel = NodeLevel 
FROM Hierarchy 
WHERE CompanyId = 20001; 

with tree([Path], [PathName], CompanyId, [Level]) 
AS 
(
SELECT h.CompanyNode AS [Path], 
     h.CompanyNode.ToString() AS [PathName], 
     h.CompanyId, 
     @currentLevel AS [Level] 
FROM Hierarchy h 
WHERE h.CompanyId = 20001 

UNION ALL 

SELECT h.CompanyNode AS [Path], 
     h.CompanyNode.ToString() AS [PathName], 
     h.CompanyId, 
     CAST((t.[Level] - 1) AS smallint) AS [Level] 
FROM Hierarchy h 
     INNER JOIN tree t ON 
      t.[Path].GetAncestor(1) = h.CompanyNode 
    WHERE h.[NodeLevel] > 0 
) 
SELECT * FROM TREE 
order by [Path] 

आप सीटीई के रिकर्सिव भाग को बदल सकते हैं और पेड़ के शीर्ष नोड को फ़िल्टर नहीं कर सकते हैं।

आशा है कि यह मदद करता है,

Oded

3

कुछ इस तरह CTE

SELECT t1.NodeId.ToString(), t1.Name 
    FROM (SELECT * FROM test_table2 
     WHERE Name = 'Node 1.1.1') t2 
    , test_table2 t1 
    WHERE 
     t1.NodeId = t2.NodeId OR 
     t2.NodeId.IsDescendantOf(t1.NodeId) = 1 
3

मैं हाल ही में HierarchyId साथ एक बहुत काम कर रहा है और मैं इस सवाल का जवाब की तलाश में में आए avoides एक अलग सवाल मैंने सोचा कि मैं इस उदाहरण को मिश्रण में फेंक दूंगा क्योंकि यह कुछ चीजों के लिए जिम्मेदार है। सबसे पहले, आप एक रिकर्सिव सीटीई के बिना वहां अपनी सशर्त अभिव्यक्ति प्राप्त कर सकते हैं। दूसरा, GetDescendantOf समावेशी है इसलिए आपको t1.NodeId = t2.NodeId (और मैं आम तौर पर सबक्वायरी में शामिल होना पसंद करता हूं) की जांच करने की आवश्यकता नहीं है। यहाँ एक पूर्ण डेमो आप के साथ खेल सकते है:

BEGIN TRANSACTION 

CREATE TABLE #HierarchyDemo 
(
    NodeId HIERARCHYID PRIMARY KEY NOT NULL, 
    Description AS NodeId.ToString(), 
    Depth AS NodeId.GetLevel() 
) 

INSERT INTO #HierarchyDemo VALUES (HierarchyId::GetRoot()); 
INSERT INTO #HierarchyDemo VALUES (CAST ('/1979/' AS HIERARCHYID)); 
INSERT INTO #HierarchyDemo VALUES (CAST ('/2012/' AS HIERARCHYID)); 
INSERT INTO #HierarchyDemo VALUES (CAST ('/2012/2/' AS HIERARCHYID)); 
INSERT INTO #HierarchyDemo VALUES (CAST ('/1979/4/' AS HIERARCHYID)); 
INSERT INTO #HierarchyDemo VALUES (CAST ('/2012/2/17/' AS HIERARCHYID)); 
INSERT INTO #HierarchyDemo VALUES (CAST ('/1979/4/6/' AS HIERARCHYID)); 

SELECT * 
FROM #HierarchyDemo; 

SELECT * 
FROM #HierarchyDemo startingPoint 
INNER JOIN #HierarchyDemo parent 
    ON startingPoint.NodeId.IsDescendantOf(parent.NodeId) = 1 
WHERE startingPoint.Description = '/2012/2/17/' 

ROLLBACK TRANSACTION 
0
Declare @hid hierarchyid=0x5D10 -- Child hierarchy id 

SELECT 
* 
FROM 
    dbo.TableName 
WHERE 
    @hid.IsDescendantOf(ParentHierarchyId) = 1  
+1

ओपी द्वारा निर्दिष्ट मौलिक स्थिति को पूरा नहीं करता है, सभी माता-पिता को बच्चे से प्राप्त करना। यह सभी बच्चों को माता-पिता से मिलता है। – JamieSee

संबंधित मुद्दे