Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да накарате родителя да даде дете в SQL SERVER 2005

Мисля, че трябва да преименувате своя child_id на възел, вашия parent_id на child_of. Наименуването на колоните ви е малко объркващо

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);

Това работи на всяка RDBMS, поддържаща 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

Изход:

parent
7

[РЕДАКТИРАНЕ:по-гъвкаво и устойчиво на бъдещето] :

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    

Изход:

to_find     found
5           1
9           7

Ако използвате Postgres , горният код може да бъде съкратен до:

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

РАЗЛИЧЕН НА скали! :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Смяна на собственик на маса

  2. sql заявка за разлика между текущия ред и предишния ред въз основа на дата и час

  3. Възможно ли е да се промени системната съхранена процедура?

  4. Как да върнете текущата стойност на версия на реда за база данни на SQL Server (пример за T-SQL)

  5. SQL шифровани колони в клаузата WHERE