Bagaimana cara memperbarui node induk di cabang baru tabel daftar kedekatan menggunakan SQL Server 2016/17?

Saya memiliki tabel daftar kedekatan di mana saya perlu mengkloning kumpulan node dan memasukkannya ke cabang baru. Pada dasarnya saya ingin mengkloning kumpulan node yang memiliki struktur yang sama dengan node induk di cabang baru. Saya menggunakan tabel temp di mana saya memiliki sumber dan menyisipkan node. Saya mencoba menggabungkan tabel temp demi item dan menggunakan CTE tetapi hasilnya salah.

Saya menguji jawaban ini tetapi ternyata tidak berfungsi jika node induk sama untuk lebih dari 1 item.

Bagaimana cara memperbarui node induk (tidak termasuk node root) dengan cara yang benar?

Apakah ada cara untuk memperbaruinya tanpa menggunakan tabel temp?

Meja

|node|parent|item|  
| 1  | Null | a  |  
| 2  | 1    | b  |    
| 3  | 1    | c  |   

Node yang dikloning

|node|parent|item|  
| 4  | Null | a  |  
| 5  | 1    | b  |    
| 6  | 1    | c  |   

Tabel suhu

|inserted_node|old_node|item|old_parent|  
| 4           | 1      | a  | Null     |  
| 5           | 2      | b  | 1        |  
| 6           | 3      | c  | 1        |  

Hasil yang diharapkan

|node|parent|item|  
| 1  | Null | a  |  
| 2  | 1    | b  |    
| 3  | 1    | c  |    
| 4  | Null | a  |  
| 5  | 4    | b  |    
| 6  | 4    | c  |    

Hasil yang salah

|node|parent|item|  
| 1  | Null | a  |  
| 2  | 1    | b  |    
| 3  | 1    | c  |  
| 4  | Null | a  |  
| 5  | 5    | b  |    
| 6  | 6    | c  |  

Kueri SQL

;WITH CTE AS 
(
SELECT
t.parent AS old_parent,
t2.node AS new_parent
FROM Table t
LEFT JOIN @TempTable t2 ON t2.item = t.item
WHERE t.node IN (SELECT node FROM @TempTable ) AND t.parent IS NOT NULL
)
UPDATE CTE 
SET old_parent = new_parent

person Dmitry Kazakov    schedule 18.03.2018    source sumber
comment
Apa logika di balik kolom node, apakah itu identitas, atau hard-coded? Saya kira pertanyaan saya adalah bagaimana Anda tahu bahwa node baru yang dikloning harus dimulai dengan nomor node 4?   -  person Niels Berglund    schedule 18.03.2018
comment
@Niels Berglund Ya kolom simpul adalah identitas. Saya menggunakan 'OUTPUT dimasukkan.id KE TempTable'. Menurut logika aplikasi saya, saya perlu memasukkan cabang baru dan hanya memperbarui node induknya di cabang baru. Saya bisa menyelesaikannya dengan bergabung dengan tabel temp untuk kedua kalinya. Apakah itu benar?   -  person Dmitry Kazakov    schedule 18.03.2018


Jawaban (1)


Saya bisa menyelesaikannya dengan bergabung dengan tabel temp untuk kedua kalinya. Apakah ada solusi yang lebih baik?

;WITH CTE AS 
(
SELECT
t.parent AS old_parent,
t3.node AS new_parent
FROM Table t
LEFT JOIN @TempTable t2 ON t2.item = t.item
LEFT JOIN @TempTable t3 ON t2.parent = t3.old_node
WHERE t.node IN (SELECT node FROM @TempTable ) AND t2.parent IS NOT NULL
)
UPDATE CTE 
SET old_parent = new_parent
person Dmitry Kazakov    schedule 18.03.2018
comment
Ini hanya berfungsi jika Anda dijamin bahwa node anak selalu merupakan anak dari node induk (root). Yang saya maksud adalah jika node 3 adalah anak dari node 2, maka tidak akan berfungsi. - person Niels Berglund; 18.03.2018
comment
Bagaimana jika node 3 bisa menjadi anak dari node 2? Akankah Level(Depth) berguna dalam kasus ini? Apa yang Anda sarankan untuk mengatasinya? - person Dmitry Kazakov; 18.03.2018
comment
Ya, level bisa berguna. Saya menyarankan untuk tidak memiliki simpul sebagai identitas di tabel Anda, itu akan mempermudah penyelesaian masalah. Saya telah mengerjakan beberapa kode di sini, tetapi saat ini saya tidak punya waktu untuk menyelesaikannya. - person Niels Berglund; 18.03.2018