Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak uzyskać rodzica, który ma dziecko w SQL SERVER 2005?

Myślę, że powinieneś zmienić nazwę swojego child_id na node, swój parent_id na child_of. Twoje nazewnictwo kolumn jest nieco mylące

create table stack_overflow
(
node int, child_of int
);


insert into stack_overflow(node, child_of) values
(1,0),
(2,1),
(3,2),
(4,2),
(5,3),
(6,4),
(7,0),
(8,7),
(9,8),
(10,1);

Działa to na każdym RDBMS obsługującym CTE :

with find_parent(parent, child_of, recentness) as
(
    select node, child_of, 0 
    from stack_overflow
    where node = 9
    union all
    select i.node, i.child_of, fp.recentness + 1
    from stack_overflow i
    join find_parent fp on i.node = fp.child_of
)
select top 1 parent from find_parent 
order by recentness desc

Wyjście:

parent
7

[EDIT:bardziej elastyczny i przyszłościowy] :

with find_parent(node_group, parent, child_of, recentness) as
(
    select node, node, child_of, 0
    from stack_overflow
    where node in (5,9)
    union all
    select fp.node_group, i.node, i.child_of, fp.recentness + 1
    from stack_overflow i
    join find_parent fp on i.node = fp.child_of
)
select q.node_group as to_find, parent as found 
from find_parent q 
join
(
    select node_group, max(recentness) as answer
    from find_parent
    group by node_group 
) as ans on q.node_group = ans.node_group and q.recentness = ans.answer 
order by to_find    

Wyjście:

to_find     found
5           1
9           7

Jeśli używasz Postgresa , powyższy kod można skrócić do:

with recursive find_parent(node_group, parent, child_of, recentness) as
(
    select node, node, child_of, 0
    from stack_overflow
    where node in (5,9)
    union all
    select fp.node_group, i.node, i.child_of, fp.recentness + 1
    from stack_overflow i
    join find_parent fp on i.node = fp.child_of
)
select distinct on (node_group) node_group as to_find, parent as found 
from find_parent 
order by to_find, recentness desc

WYRÓŻNIA SIĘ NA skałach! :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wskazówki dotyczące przenoszenia bazy danych SQL Server z jednego serwera na drugi — samouczek SQL autorstwa Rajana Singha

  2. 3 sposoby na zliczanie liczby tabel systemowych w bazie danych SQL Server

  3. SQL do pozyskiwania danych z dowolnego poprzedniego miesiąca

  4. SQL Server Konwertuj liczbę całkowitą na ciąg binarny

  5. Entity Framework nie działa z tabelą czasową