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 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ölje på http://www.databasteknik.se/webbkursen/ordlista.html
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 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 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
BrimbaMedlem sedan dec. 19995 875 inlägg 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
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.