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

Kueri Anak/Orang Tua Rekursif di T/SQL

Anda akan membutuhkan rekursi Anda untuk juga membangun sesuatu yang dapat diurutkan di akhir:

declare @t TABLE (
[CHILD] [int] NOT NULL,
[PARENT] [int] NOT NULL
) 

insert @t values
( 0, -1),   -- I added this
( 1, 2 ),
( 2, 0 ),
( 3, 1 ),
( 4, 2 ),
( 5, 0 )

(perhatikan saya telah menambahkan elemen root yang sebenarnya)

;with n(CHILD, PARENT, GENERATION, hierarchy) as (
select CHILD, PARENT,0, CAST(CHILD as nvarchar) as GENERATION from @t
where PARENT=-1
union all
select nplus1.CHILD, nplus1.PARENT, GENERATION+1, 
cast(n.hierarchy + '.' + CAST(nplus1.child as nvarchar) as nvarchar)
 from 
@t as nplus1 inner join n on nplus1.PARENT=n.CHILD 
)
select CHILD,GENERATION
from n
order by hierarchy

kembali

CHILD       GENERATION
----------- -----------
0           0
2           1
1           2
3           3
4           2
5           1

Termasuk hierarchy sebagai ilustrasi:

CHILD       GENERATION  hierarchy
----------- ----------- ------------------------------
0           0           0
2           1           0.2
1           2           0.2.1
3           3           0.2.1.3
4           2           0.2.4
5           1           0.5

Bergantung pada seberapa besar id Anda, Anda mungkin harus melakukan hal-hal dengan padding kiri dengan nol untuk mendapatkan penyortiran yang benar.

Perhatikan bahwa SQL 2008 memiliki hierarchy bawaan ketik untuk hal semacam ini...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DATEFROMPARTS() Contoh di SQL Server (T-SQL)

  2. Inilah Tiga Alasan Mengapa Anda Mungkin Melihat Aktivitas Puncak di Instance SQL Anda

  3. Apakah urutan Sql JOIN mempengaruhi kinerja?

  4. Mengapa koneksi ODBC saya gagal saat menjalankan beban SSIS di Visual Studio tetapi tidak saat menjalankan paket yang sama menggunakan Execute Package Utility

  5. Bagaimana saya bisa melampirkan database?