की सुविधा देता है मान लेते हैं तो आप इस तालिका है:
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
स्रोत
2011-04-27 07:07:08
यह सवाल भी यहाँ उत्तर दिया गया है, और एक नहीं बल्कि दिलचस्प साइमन इन्स द्वारा सुझाए गए दृष्टिकोण है। http://stackoverflow.com/questions/3119860/how-do-you-get-all-ancestors-of-a-node-using-sql-server-2008-hierarchyid चीयर्स, – Eric
आपको तालिका से कॉलम देना चाहिए कुछ नमूना डेटा के साथ और फिर आउटपुट के रूप में आप जो हासिल करना चाहते हैं उसे प्रदान करें। इससे लोगों को बेहतर उत्तर देने में मदद मिलेगी। इसके अलावा, अगर आप पहले से ही कुछ कोशिश कर चुके हैं तो आपको SQL कोड देना चाहिए। – JamieSee