SQL dotaz vrátí řetězec

0

Otázka

Mám tabulku, která sleduje změny. Jeden sloupec se nazývá beforename a další aftername.

Některé ukázkové údaje by mohly být:

Rodič Dítě
a b
b c
c d

Snažím se napsat dotaz, který bude samostatně referenční sebe takovým způsobem, jak vrátit změny, tj.:

a -> b -> c -> d (the arrows are just for notation here)

Je to možné udělat v SQL?

Moje databáze je SQL Server

chaining hierarchy sql sql-server
2021-11-15 05:40:09
1

Nejlepší odpověď

0

Můžete použít rekurzivní společné tabulka výraz (CTE);

WITH cte(Root, Level, Parent, Child) AS (
  SELECT Parent, 0, Parent, Child FROM Table1 
     WHERE Parent NOT IN (SELECT Child FROM Table1)
  UNION ALL
  SELECT cte.Root, cte.Level + 1, t1.Parent, t1.Child 
  FROM cte 
  JOIN Table1 t1 
     ON cte.Child = t1.Parent AND cte.Level < 10
)
SELECT * FROM cte ORDER BY Root, Level;

V podstatě rekurzivní CTE používá základní případ (najít všechny výchozí body). Ten používá;

SELECT Parent, 0, Parent, Child FROM Table1 
     WHERE Parent NOT IN (SELECT Child FROM Table1)

...který najde všechny rodiče, že je v řadách, kde rodiče je nikdy zmínil se v tabulce jako dítě. To pak nastaví ty rodiče jako "Root" a nastaví úroveň na hodnotu 0.

To pak pokračuje, aby našli dítě, které řádky pro root pomocí;

SELECT cte.Root, cte.Level + 1, t1.Parent, t1.Child 
  FROM cte 
  JOIN Table1 t1 
     ON cte.Child = t1.Parent AND cte.Level < 10

...což v podstatě jen najde další dítě (řádek, který má tento řádky dítě jako rodič) při zachování kořene a zvyšuje level o 1.

To také omezuje rekurze na 10 úrovní, jen v případě, že je smyčka v datech.

A dbfiddle otestovat

2021-11-15 06:10:24

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................