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

SQL Server CTE -Temukan parentID teratas untuk Setiap childID?

Tidak bisakah kamu melakukan sesuatu seperti ini?

;WITH cte AS (....)
SELECT
    * 
FROM 
    cte
CROSS APPLY 
    dbo.myTable tbl ON cte.XXX = tbl.XXX

Letakkan CROSS APPLY setelah definisi CTE - ke dalam satu pernyataan SQL yang merujuk kembali ke CTE. Bukankah itu berhasil??

ATAU: - membalik logika Anda - lakukan CTE "top-down", yang memilih node tingkat atas terlebih dahulu, dan kemudian beralih melalui hierarki. Dengan cara ini, Anda dapat dengan mudah menentukan "bapak tingkat atas" di bagian pertama CTE rekursif - seperti ini:

;WITH ChildParent AS
(
    SELECT
        ID,
        ParentID = ISNULL(ParentID, -1),
        SomeName, 
        PLevel = 1,   -- defines level, 1 = TOP, 2 = immediate child nodes etc.
        TopLevelFather = ID  -- define "top-level" parent node
    FROM dbo.[Agent_Agents] 
    WHERE ParentID IS NULL

    UNION ALL

    SELECT
        a.ID,
        ParentID = ISNULL(a.ParentID, -1),
        a.SomeName, 
        PLevel = cp.PLevel + 1,
        cp.TopLevelFather   -- keep selecting the same value for all child nodes
    FROM dbo.[Agent_Agents] a
    INNER JOIN ChildParent cp ON r.ParentID = cp.ID
)
SELECT  
   ID,
   ParentID,
   SomeName,
   PLevel,
   TopLevelFather   
FROM ChildParent

Ini akan memberi Anda node seperti ini (berdasarkan data sampel Anda, sedikit diperluas):

ID  ParentID  SomeName      PLevel  TopLevelFather
20    -1      Top#20           1          20
 4    -1      TOP#4            1           4
 8    -1      TOP#8            1           8
 7     8      ChildID = 7      2           8
 3     7      ChildID = 3      3           8
 2     4      ChildID = 2      2           4
 9    20      ChildID = 9      2          20
 5     9      ChildID = 5      3          20
 1     5      ChildID = 1      4          20

Sekarang jika Anda memilih simpul anak tertentu dari keluaran CTE ini, Anda akan selalu mendapatkan semua info yang Anda butuhkan - termasuk "tingkat" anak, dan simpul induk tingkat atas.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sql Server 2008 - Nilai uang pembulatan FullText?

  2. Hapus satu catatan dari Entity Framework?

  3. Apakah mungkin untuk memaksa penguncian tingkat baris di SQL Server?

  4. Alat Data SQL Server Visual Studio 2015 tidak ada opsi Tambahkan Tabel

  5. Bagaimana cara mengeluarkan DateTime yang dapat dibatalkan dari database