2011-08-04 124 views
0

我們在工作中有SQL數據庫的表中,有一欄,report_to名員工,其中包含該人該員工報告的用戶名。我們想要做的是將這種表示改爲數字表示。例如:層次在SQL


'A' 報告 'B' 報告,以 'C'。因此,表示將像「A」 = 49,「B」 = 50,「C」 = 51如果「d」變成「C」的老闆,那麼「d」 = 52。如果「A」成爲實習生「e」和「F」,則「e」和「F」兩者都等於48。


如圖所示的主管,在非零編號開始的數字允許擴張不僅向上而且也沿着分級鏈。

的主要問題是,如何從目前的結構(「report_to」)轉換,爲數值表示?

注:這是MSSQL

+0

什麼版本的SQL Server? 2008+具有幫助的分層數據類型。 – Oded

+0

2008 R2,是可導出到sharepoint的數據類型嗎? – Vap0r

+0

你是指可導出的? – Oded

回答

1

您可以添加新列(評級)應該是0

那麼第一步是要找到大老闆 - 這應該是誰沒有一個老闆的用戶 - report_to爲null。他的排名將是1

第二步是找到他的第一個指示。他們將排名爲2.類似於:

UPDATE TABLE SET RANK = 2 
WHERE report_to IN 
(SELECT username FROM TABLE WHERE RANK = 1) 

第三步是找到指揮的指揮。例如:

UPDATE TABLE SET RANK = 3 
WHERE report_to IN 
(SELECT username FROM TABLE WHERE RANK = 2) 

接下來的步驟與步驟2和3相同,直到找不到RANK = 0。

所有這些步驟都可以在過程完成,WHILE語句內。

最後,如果你想從50開始,而不是排名上的1,那麼你就可以進行更新:

UPDATE TABLE SET RANK = 50 - RANK 

或以確保您不會錯過任何東西:

UPDATE TABLE SET RANK = (SELECT MAX(RANK) FROM TABLE) + 1 - RANK 
+0

太多的查詢正在進行,我認爲有一個更簡單的方法來做到這一點。 – Grigor

+0

每次在系統中添加/刪除/升級/降級時,這也需要重新運行。 –

+0

@Grigor:只有一個應該在循環中運行。 – CristiC

-2

在我看來,你並不需要使用數字計數器,只使用位置,因爲你不能有無限的位置,它去的地方停下來。每個用戶名都應該有一個職位,比如實習生,主管,僱主,項目經理等等。當你改變了可以說實習生的位置更高,那麼上司就會成爲僱主,或者類似的東西。你明白了。 :)

+0

問題是,在這個組織中,在一個子節點上可能有11個父節點,如果這不是以數字格式表示,那麼我不得不使用大於小於邏輯檢查的數值,用大量的if/else語句做一些事情。事情是,我們受到if/else檢查的限制,因爲它被引入MS共享點,用作與infopath的數據連接。 這就是說,你知道任何方式來實現這一目標嗎?或者至少要解決這個問題? – Vap0r

0

哇...所以你有一個用戶表?如果不是,那麼建議1就是創建一個。

users_table 
------------ 
username 
user_id 
name_first 
name_last 
other_stuff_? 

然後用所有現有的用戶名填充 - 可能通過查詢您描述的唯一名稱的表。在此步驟中,user_id將被填充爲排序的id值。

那麼你可以添加一個新表,

user_user 
----------- 
user_id_1 
user_id_2 
relationship 
begin_dt 
end_dt 

那麼你可以用每個用戶到用戶的關係這個新表,當它是有效的。例如用戶48是與用戶50開始在某一天有關係=「管理」

的關係應該是可能是一個FK另一個表...但我留給你作爲一個鍛鍊; Tibial。

1

如果您有一個包含表中員工主管的字段,則可以使用recusive CTE來獲取層次結構。如果您有任何問題,請在聯機叢書中查找並回復給我們。

+0

遞歸CTE很性感。這可能是最乾淨的解決方案。 –