Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara mendapatkan orang tua yang diberikan anak di SQL SERVER 2005

Saya pikir Anda harus mengganti nama child_id Anda menjadi node, parent_id Anda menjadi child_of. Penamaan kolom Anda agak membingungkan

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

Ini berfungsi pada RDBMS berkemampuan 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

Keluaran:

parent
7

[EDIT:lebih fleksibel dan tahan masa depan] :

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    

Keluaran:

to_find     found
5           1
9           7

Jika Anda menggunakan Postgres , kode di atas bisa disingkat menjadi:

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

BERBEDA PADA batu! :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Solusi untuk INSERT ATAU UPDATE di SQL Server

  2. Studi Kasus Peningkatan Perangkat Keras Server Database SQL Server

  3. Buat Pekerjaan Agen SQL Server menggunakan T-SQL

  4. Klien dengan alamat IP tidak diizinkan untuk mengakses database server Azure SQL

  5. temukan panjang variabel untuk tipe data server sql nvarchar dari kode c #