View

如何將子表展平為父表

  • February 11, 2018

我繼承了一個數據庫,我需要將現有的父子關係轉換為所有父母。

讓我先解釋一下現有數據。這些表的結構類似於:

Thing                  Widget
------------           ------------
thing_id               widget_id
thing_name             widget_name
thing_rank             widget_rank
                      thing_id

數據以 s 的列表的形式呈現給最終使用者Things,有時還以Thinghas-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,然後兩個孩子Widgets 屬於“綠色事物”,並按其等級排序:

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在這裡

引用自:https://dba.stackexchange.com/questions/197621