webForumDet fria alternativet

Trädstruktur

6 svar · 301 visningar · startad av renholm

renholmMedlem sedan apr. 20012 048 inlägg
#1

Har ett en tabell som ser ut så här:

node_id	uniqueidentifier	16	0
node_parent	uniqueidentifier	16	1
node_name	nvarchar	50	0
node_roles	nvarchar	200	1
node_admins	nvarchar	200	1
node_order	int	4	0
node_domain	nvarchar	50	1

Jag vill ha hela "trädet" med noder från den node som är vald, dvs om jag väljer node 36 så ska den kolla vilka noder som har den som parent och vilka noder som finns ovanför node 36. Har försökt mig på detta men får det inte riktigt att funka, stöter på problem då jag ska gå uppåt i hierarkin.

Min stored procedure

DECLARE  @currentnodeparent uniqueidentifier
SET @currentnodeparent = (SELECT node_parent FROM Nodes WHERE node_id = @nodeid)

SELECT * FROM Nodes WHERE node_id = @nodeid

SELECT * FROM Nodes WHERE node_parent = @nodeid

WHILE @currentnodeparent <> null
BEGIN
	SELECT * FROM Nodes WHERE node_id = @currentnodeparent
	SET @currentnodeparent = (SELECT node_parent FROM Nodes WHERE node_id = @currentnodeparent)
END

Någon som har någon lösning/annat sätt att göra det på?

btw, finns det någon nackdel med att använda uniqueidentifier? använder den för att undvika att det ska bli problem vid ihopslagningar av data osv.

LarsGMedlem sedan dec. 200012 465 inlägg
renholmMedlem sedan apr. 20012 048 inlägg
#3

danke :)

renholmMedlem sedan apr. 20012 048 inlägg
#4

Hum, den var inte riktigt vad jag ville ha, vill ha så att noderna över väljs, inte de som ligger under. Har försökt att göra om den kod som fanns i exemplet men får inte till det. Förslag?

renholmMedlem sedan apr. 20012 048 inlägg
#5

Ah, fick igång min kod jag hade i ursprungsinlägget, var uniqueidentifier som ställde till det, ändrade till vanligt int.

renholmMedlem sedan apr. 20012 048 inlägg
#6

Nu är jag tillbaka fast denna gång måste jag använda uniqieidentifier. Försökte med samma kod men #stack innehåller ingen data.

DECLARE @i int
DECLARE @current uniqueidentifier

SET @current = '{011DAF52-C53D-4017-89C7-603EE1A4DE5C}'

CREATE TABLE #stack (node_guid uniqueidentifier, node_name nvarchar(50), node_position int)
WHILE @current <> null
BEGIN
	INSERT #stack
		SELECT node_guid, node_name, @i FROM Nodes WHERE node_guid = @current
		
	SELECT @current = node_parentid FROM Nodes WHERE node_guid = @current
	SET @i = (@i + 1)
END
SELECT * FROM #stack ORDER BY node_position DESC
SELECT @current
DROP TABLE #stack

Tabellen

	{00000000-0000-0000-0000-000000000000}		1	1	1	Root	
	{AA3C8C07-1273-4177-85B6-430115647B12}	{011DAF52-C53D-4017-89C7-603EE1A4DE5C}	1	7	1	Child 1 1 1	
	{011DAF52-C53D-4017-89C7-603EE1A4DE5C}	{B95A9A7F-A165-47C6-A8A3-EE9C330F4677}	1	5	1	Child 1 1	
	{B95A9A7F-A165-47C6-A8A3-EE9C330F4677}	{00000000-0000-0000-0000-000000000000}	1	3	1	Child 1

Vad kan vara fel? Finns det något bättre sätt att få tag på vilka Nodes som är över i hierarkin?

renholmMedlem sedan apr. 20012 048 inlägg
#7

Dumma mig, is not null ska det vara i stället för <>.

Genererad på 473 ms · cache AV · v20260730165559-full.f96bc7eb