---
title: "rekursiv sql med parent and child"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/181981-rekursiv-sql-med-parent-and-child"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Nickemannen"
published: "2010-01-12T12:04:17.000Z"
updated: "2010-01-13T12:24:58.000Z"
replies: 7
views: 1479
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/181981-rekursiv-sql-med-parent-and-child"
---

# rekursiv sql med parent and child

## #1 — Nickemannen, 2010-01-12T12:04Z

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?

Permalänk: https://www.webforum.nu/p/181981

## #2 — erciz, 2010-01-12T12:16Z

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>

Permalänk: https://www.webforum.nu/p/2222655

## #3 — Nickemannen, 2010-01-12T12:30Z

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?

Permalänk: https://www.webforum.nu/p/2222658

## #4 — erciz, 2010-01-12T12:38Z

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.

Permalänk: https://www.webforum.nu/p/2222659

## #5 — Brimba, 2010-01-12T20:58Z

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
```

Permalänk: https://www.webforum.nu/p/2222719

## #6 — nitro2k01, 2010-01-12T21:33Z

Som flera gånger förut rekommenderar jag följande länkar: 
<http://www.alberton.info/talks_dpc_2009_wrapup.html>
<http://www.slideshare.net/quipo/trees-in-the-database-advanced-data-structures?type=presentation>

Permalänk: https://www.webforum.nu/p/2222730

## #7 — Brimba, 2010-01-12T21:42Z

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>

Permalänk: https://www.webforum.nu/p/2222737

## #8 — Nickemannen, 2010-01-13T12:24Z

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.

Permalänk: https://www.webforum.nu/p/2222803

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/181981-rekursiv-sql-med-parent-and-child
