View
如何將子表展平為父表
我繼承了一個數據庫,我需要將現有的父子關係轉換為所有父母。
讓我先解釋一下現有數據。這些表的結構類似於:
Thing Widget ------------ ------------ thing_id widget_id thing_name widget_name thing_rank widget_rank thing_id
數據以 s 的列表的形式呈現給最終使用者
Things
,有時還以Thing
has-aWidget
的形式呈現,小元件呈現為 s 的“下方”或“子”Thing
。所以有一些層次結構。另一個關鍵是此展示文稿按thing_rank
和排序widget_rank
。這是一個帶有數據的具體範例:
事物:
1001 "thing blue" 1 1002 "thing green" 3 1003 "thing red" 4 1004 "thing yellow" 2
小元件:
2001 "widget cucumber" 2 1002 2002 "widget bean" 1 1002
這將呈現
Thing
按等級排序的 s,然後兩個孩子Widget
s 屬於“綠色事物”,並按其等級排序:1 thing blue 2 thing yellow 3 thing green 1 widget bean 2 widget cucumber 4 thing red
任務是刪除層次結構,但保留等級順序。例如,上述數據將被分配一個新的等級,所有數據將屬於同一個關係——不再是父子關係。例如:
1 thing blue 2 thing yellow 3 thing green 4 widget bean 5 widget cucumber 6 thing red
單一的關係是:
Stuff ------------- stuff_id stuff_type (thing|widget) stuff_name stuff_rank
我正在尋找如何創建一個
Stuff
既顯示數據Thing
又顯示Widget
數據的視圖,以及新的排名分配。
由於您沒有提供任何 RDBMS,我試圖發布一個應該在多個系統中工作的答案。
記錄可以使用 row_number() 視窗函式按等級排序和編號。
select row_number() over (order by r1, r2) id, name from ( select t.name as [name], t.[rank] r1, 0 as r2 from thing t union all select w.name as [name], t.[rank] r1, w.[rank] r2 from widget w join thing t on t.id = w.thing_id ) x; GO
編號 | 姓名 :- | :-------------- 1 | 藍色的東西 2 | 黃色的東西 3 | 綠色的東西 4 | 小元件豆 5 | 小元件黃瓜 6 | 紅色的東西
dbfiddle在這裡