我有一張桌子:
| ID | 描述 | 父母ID |
|---|---|---|
| 1 | 測驗A | 0 |
| 2 | 測驗A | 0 |
| 3 | 測驗A | 0 |
| 4 | 測驗 B | 0 |
| 5 | 測驗 B | 0 |
| 6 | 測驗 B | 0 |
我需要一個 SQL 更新腳本的幫助,該腳本將采用第一個不同的 Desc,保持 parentID 為 0,但使 Desc 的所有其他實體具有第一個的 ParentID。
所以,到最后,它將是:
樣本結果資料:
| 1 | 測驗A | 0 |
| 2 | 測驗A | 1 |
| 3 | 測驗A | 1 |
| 4 | 測驗 B | 0 |
| 5 | 測驗 B | 4 |
| 6 | 測驗 B | 4 |
uj5u.com熱心網友回復:
Desc 是一個保留字,所以它是一個不好的選擇,其余的可以用 cte 解決以獲得所有 Desc 的父級
WITH CTE as (
SELECT MIN(ID) min_id, [Desc] FROM TableA GROUP BY [Desc])
SELECT [ID], ta.[Desc], CASE WHEN ID = min_id THEN ParentID ELSE min_id END as ParentID
FROM TableA ta JOIN CTE ON ta.[Desc] = CTE.[Desc]
| ID | 描述 | 父母ID |
|---|---|---|
| 1 | 測驗A | 0 |
| 2 | 測驗A | 1 |
| 3 | 測驗A | 1 |
| 4 | 測驗 B | 0 |
| 5 | 測驗 B | 4 |
| 6 | 測驗 B | 4 |
小提琴
更新其實也很簡單
WITH CTE as (
SELECT MIN(ID) min_id, [Desc] FROM TableA GROUP BY [Desc])
, CTE2 AS (SELECT [ID], CASE WHEN ID = min_id THEN ParentID ELSE min_id END as ParentID
FROM TableA ta JOIN CTE ON ta.[Desc] = CTE.[Desc])
UPDATE TableA SET ParentID = (SELECT ParentID FROM CTE2 WHERE ID = TableA.ID)
6 rows affected
SELECT * FROM TableA
| ID | 描述 | 父母ID |
|---|---|---|
| 1 | 測驗A | 0 |
| 2 | 測驗A | 1 |
| 3 | 測驗A | 1 |
| 4 | 測驗 B | 0 |
| 5 | 測驗 B | 4 |
| 6 | 測驗 B | 4 |
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/510529.html
標籤:sqlsql服务器
