webForumDet fria alternativet

rekursiv sql med parent and child

7 svar · 1 443 visningar · startad av Nickemannen

NickemannenMedlem sedan aug. 20003 575 inlägg
#1

Hej jag har stött på ett klurigt problem som måste lösas i sql.

Vi har en tabell med Kategorier där kategorier kan ligga i andra kategorier osv.

Tabellnamn: ArticleCategory

Id ParentId Name

Nu är det så att vi behöver hämta alla kategorier som inte finns med som child i trädet under en viss kategori.
Business case:t är när en kategori skall läggas in i en annan och då vill vi inte att det skall kunna bli en cirkulär referensgång.

Hur löser vi det?

ercizMedlem sedan maj 20011 826 inlägg
#2

Jag tror att det här är ett fall av något som kallas "ett transitivt hölje" och inte kan lösas i bara SQL. Men det går att lösa med Stored Procedures. Det är nog det jag minns från databaskursen, tror inte att jag kan hjälpa dig mer, men jag tycker att det är ett intressant problem. Kolla Transitivt höljehttp://www.databasteknik.se/webbkursen/ordlista.html

NickemannenMedlem sedan aug. 20003 575 inlägg
#3

Okej det var det jag misstänkte att det inte gick direkt. Någon som har några ide'er på hur en lösning med SP skulle se ut?

ercizMedlem sedan maj 20011 826 inlägg
#4

Blir det inte nåt i stil med att man får göra en SELECT och sen spara resultatet och göra nya SELECT med villkor beroende på de tidigare resultaten, och sen fortsätta så tills man har gått igenom det hela.

BrimbaMedlem sedan dec. 19995 875 inlägg
#5

Jag förstår inte riktigt problemställningen.
Men om det är en rekursiv funktion som hämtar alla childs baserat på ett visst parentid kan du göra såhär med en CTE i sql-server:


/*
create table ArticleCategory (Id int, ParentId int, Name varchar(50))
insert into ArticleCategory
	select 1, 0, 'root'
	union all
	select 2, 1, 'subcat1'
	union all
	select 3, 2, 'subcat2'
	union all
	select 4, 1, 'subcat1'
	union all
	select 5, 2, 'subcat2'
*/

DECLARE @id INT
SET @id = 2;
WITH SubArticleCategory
AS
(
  SELECT Id, 0 AS lvl
  FROM ArticleCategory
  WHERE Id = @id
  UNION ALL
  SELECT AC.Id, SAC.lvl + 1
  FROM SubArticleCategory AS SAC
  INNER JOIN dbo.ArticleCategory AS AC ON AC.ParentId = SAC.Id
)
SELECT * FROM SubArticleCategory
nitro2k01Medlem sedan aug. 20039 342 inlägg
BrimbaMedlem sedan dec. 19995 875 inlägg
#7

Lite off topic:
Om du använder sql-server 2008 så finns det en datatyp som heter hierarchyid som du kan använda.

Läs mer om det här: http://aspalliance.com/1722_sql_server_2008_new_features__hierarchy_data_type

NickemannenMedlem sedan aug. 20003 575 inlägg
#8

Ja det är Sql Server 2008, får kika vidare har sett den där lösningen med with när jag har sökt tidigare dock inte fattat den eller kunnat testa den då sql server management säger att det är fel vid den raden. Tack så mycket så mycket jag skall kika vidare på det.
Återkommer om jag får mer problem.

126 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)