iT邦幫忙

1

MS SQL 部門階層排序

b_bg 2020-03-29 17:57:141103 瀏覽

嗨大家好~
最近遇到一個問題想要請教大家
下面有張資料表test存取各單位部門
https://ithelp.ithome.com.tw/upload/images/20200329/20125955iPrTVejeUH.png
而欄位name為部門名稱、ID為該部門階層碼、P_ID為上層部門階層碼,
並希望依據其『上下層關係』排列如下圖順序(請參考圖中上下層ID及P_ID關係。)
https://ithelp.ithome.com.tw/upload/images/20200329/20125955EZ5ObBMsI6.png

參考一些文章後 撰寫出的程式碼與運行結果如下/images/emoticon/emoticon06.gif
https://ithelp.ithome.com.tw/upload/images/20200329/20125955yGekbuLD36.png

運行結果來說A2尚未被正確排序、
以及若使用這個寫法當遇到大量資料時這種方法會非常麻煩,
自己是SQL新手,想請問是否有更好的修改方式,感激不盡!!/images/emoticon/emoticon24.gif

石頭 iT邦研究生 2 級 ‧ 2020-03-29 17:59:32 檢舉
請使用Order by.
b_bg iT邦新手 5 級 ‧ 2020-03-29 18:18:51 檢舉
您是說order by NAME嗎? 不好意思可能問題沒有敘述得很明確,NAME是我隨意編的,實際資料NAME欄位的內容可能是中文,所以沒辦法直接使用order by
1
PPTaiwan
iT邦新手 5 級 ‧ 2020-03-29 18:37:06

你有看過樹狀結構的方式嗎??

https://www.google.com/search?q=%E6%A8%B9%E7%8B%80%E7%B5%90%E6%A7%8B&newwindow=1&sxsrf=ALeKk02DLO1V647z5zPQGV8mES5L8FH9rQ:1585478102829&tbm=isch&source=iu&ictx=1&fir=hiw9VerLJAh0uM%253A%252CbWyGGEQsUCv-cM%252C%252Fm%252F07kyv&vet=1&usg=AI4_-kSBBluNdqoDZUHckeLpQLXCMZUHDw&sa=X&ved=2ahUKEwjV5viYvr_oAhWLwJQKHX4vDhkQ_B0wbnoECAIQAw#imgrc=hiw9VerLJAh0uM

你可以先了解看看,可以符合大部份階層單位


CREATE TABLE [dbo].[單位資料表名稱](
	[DEPT_NOTEID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
	[DEPT_PARENDID] [numeric](18, 0) NOT NULL,
	[DEPT_ID] [nvarchar](20) NULL,
	[DEPT_ORDERBY] [int] NULL,
	[DEPT_LEVEL] [int] NULL,
	[DEPT_CNAME] [nvarchar](60) NULL
 CONSTRAINT [PK_DEPT] PRIMARY KEY CLUSTERED 
(
	[DEPT_NOTEID] ASC,
	[DEPT_PARENDID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[單位資料表名稱] ADD  CONSTRAINT [DF_DEPT_DEPT_LOCK]  DEFAULT ((0)) FOR [DEPT_LOCK]
GO

ALTER TABLE [dbo].[單位資料表名稱] ADD  CONSTRAINT [DF_DEPT_DEPT_SYSTEMLOCK]  DEFAULT ((0)) FOR [DEPT_SYSTEMLOCK]
GO

https://ithelp.ithome.com.tw/upload/images/20200329/20104851QTBdoZVO57.jpg

再用遞回的方式來找出上下階層,那每一單位往後如要再拆離成為新的單位。這樣子的結構用在單位或是公文分層的處理。

1
一級屠豬士
iT邦高手 1 級 ‧ 2020-03-29 19:46:01

遞迴查詢樹狀階層,有分深度優先廣度優先.

1
pilipala
iT邦新手 5 級 ‧ 2020-03-30 06:12:37

WITH common_table_expression 參考該文章的範例 D. 利用遞迴通用資料表運算式來顯示多層級的遞迴

我要發表回答

立即登入回答