Domů
Nápověda
Přihlásit
Registrovat
Vítejte
Host
. Prosím
přihlašte se
nebo
zaregistrujte
.
Forum Delphi.cz
»
Databáze
»
MS SQL
»
Rekurzivní SELECT v pořadí depth-first
« předchozí
další »
Tisk
Stran: [
1
]
Dolů
Autor
Téma: Rekurzivní SELECT v pořadí depth-first (Přečteno 4016 krát)
pepak
Padawan
Příspěvků: 1573
Karma: 37
Rekurzivní SELECT v pořadí depth-first
«
kdy:
10-08-2012, 12:18:01 »
Mám jednoduchou tabulku s n-árním stromem:
Kód:
[Vybrat]
STROM(id, id_rodice, poradi, payload)
Z této tabulky umím udělat hierarchický dotaz, který mi vrátí všechny položky v pořadí breadth-first:
Kód: SQL
[Vybrat]
WITH
hierarchy
(
level
,
id
,
id_rodice
,
poradi
,
payload
)
AS
(
SELECT
0
,
id
,
id_rodice
,
poradi
,
payload
FROM
strom
WHERE
id
=
123
-- ID korene zadane zvenku
UNION
ALL
SELECT
h
.
level
+
1
,
s
.
id
,
s
.
id_rodice
,
s
.
poradi
,
s
.
payload
FROM
strom s
JOIN
hierarchy h
ON
h
.
id
=
s
.
id_rodice
)
SELECT
*
FROM
hierarchy
ORDER
BY
level
,
poradi
Nenapadá mě, jak to prostředky SQL vrátit v pořadí depth-first. Nějaký nápad?
IP zaznamenána
jirka
Host
Re:Rekurzivní SELECT v pořadí depth-first
«
Odpověď #1 kdy:
14-09-2012, 08:18:17 »
Ahoj,
jde to tak, že si uložíš do každému záznamu cestu k uzlu. Na MSSQL se dá vhodně použít funkce
ROW_NUMBER() OVER(...)
, která očísluje uzly jednoho rodiče. Následující kód bude fungovat pro maximální počet 9 uzlů jednoho rodiče a max. úrověň 255, pro více se musí upravit výraz pro "path_to_node".
Kód: SQL
[Vybrat]
WITH
hierarchy
(
level
,
id
,
id_rodice
,
poradi
,
payload
,
path_to_node
)
AS
(
SELECT
0
,
id
,
id_rodice
,
poradi
,
payload
,
CAST
(
'1'
AS
VARCHAR
(
255
)
)
FROM
strom
WHERE
id
=
123
-- ID korene zadane zvenku
UNION
ALL
SELECT
h
.
level
+
1
,
s
.
id
,
s
.
id_rodice
,
s
.
poradi
,
s
.
payload
,
CAST
(
h
.
path_to_node
+
CAST
(
ROW_NUMBER
(
)
OVER
(
ORDER
BY
h
.
level
)
AS
VARCHAR
)
AS
VARCHAR
(
255
)
)
FROM
strom s
JOIN
hierarchy h
ON
h
.
id
=
s
.
id_rodice
)
SELECT
*
FROM
hierarchy
ORDER
BY
path_to_node
HTH
Jirka
IP zaznamenána
pepak
Padawan
Příspěvků: 1573
Karma: 37
Re:Rekurzivní SELECT v pořadí depth-first
«
Odpověď #2 kdy:
14-09-2012, 08:38:46 »
Díky.
Ve finále jsem to stejně udělal na úrovni aplikace, protože to muselo chodit i na SQL Serveru 2000, který rekurzivní dotazy neumí, ale jsem rád za informaci, jak to udělat.
IP zaznamenána
Tisk
Stran: [
1
]
Nahoru
« předchozí
další »
Forum Delphi.cz
»
Databáze
»
MS SQL
»
Rekurzivní SELECT v pořadí depth-first