Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để lấy cha mẹ cho một đứa trẻ trong SQL SERVER 2005

Tôi nghĩ bạn nên đổi tên child_id của bạn thành node, parent_id của bạn thành child_of. Đặt tên cột của bạn hơi khó hiểu

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

Điều này hoạt động trên bất kỳ RDBMS hỗ trợ CTE nào :

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

Đầu ra:

parent
7

[CHỈNH SỬA:linh hoạt hơn và phù hợp với tương lai] :

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    

Đầu ra:

to_find     found
5           1
9           7

Nếu bạn đang sử dụng Postgres , đoạn mã trên có thể được rút ngắn thành:

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

DISTINCT TRÊN đá! :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đăng ký tên máy chủ mới trong Sql Managment Studio

  2. Mô phỏng CONNECT BY PRIOR của Oracle trong SQL Server

  3. Làm cách nào để bật và tắt IDENTITY_INSERT bằng SQL Server 2008?

  4. Tìm các thực thể tham chiếu trong SQL Server:sys.dm_sql_referencing_entities ()

  5. Làm cách nào để tải hình ảnh từ SQL Server vào hộp hình ảnh?