資料展開疑問, 用SQL處理還是用BCB好?? |
尚未結案
|
Dip
一般會員 發表:6 回覆:4 積分:2 註冊:2004-04-19 發送簡訊給我 |
小弟遇上一些問題,請大大們指引條明路.
DB內容為
A1,BB
A1,CC
A1,DD
A2,GG
...
...
CC,XX
CC,YY 現要建樹成為以下模型.
A1
|---BB
|---CC
| |--XX
| |--YY
|
|---DD 那麼要用SQL語法還是用BCB來處理呢? 疑問1.
使用SQL語法,第一層是沒問題,但要如何將結果再處理一次呢?.
做Temp再聯合嗎?似乎行又似乎不可行.因為考慮到多個多層就覺得不可行了. 疑問2.
BCB中,Query後結果是放在何處呢??小弟想一一取出處理. 小弟是BCB新手,不敢祈求大大們動手寫,但請大大們一定要給個重點提示.拜謝!!
|
chrischung73
一般會員 發表:5 回覆:13 積分:3 註冊:2004-03-30 發送簡訊給我 |
Dear Dip: 我想使用TTreeView來展示應該沒錯吧.
只是如何擷取資料讓你傷腦筋. 只用一次SQL是不大可能辦到的(請SQL command高手們指教)
因此你可以用遞迴迴圈來讀取資料. 全部一股腦放到TTreeView中,
但這個方法有個問題是, 資料量多時須花費許多時間等待, 甚至可能有memory overflow 的情況 另外的方法是, 先展示第一層資料, 配合TTreeView的 Event (也許是OnExpanding), 於使用者要展開第一層某筆記錄時, 再擷取加入該筆記錄的第二層. 這是我以前的經驗, BCB我沒有真正implement過...也許有更好的更新的方式
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
bigdogchina
版主 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
|
Dip
一般會員 發表:6 回覆:4 積分:2 註冊:2004-04-19 發送簡訊給我 |
目前的想法是,採用T-SQL 自訂遞迴函式展開各層.
再存入暫存表內.再一一賦予 KeyField & ParentField值.
(因為預定要用DevExpress dxDBTreeView顯示.)
最後再裝入MSSQL預存程序中.
看看能不能解決BCB上的效率問題.
取自Fishman大的Oracle遞迴式的 SQL Command.
BCB不成,就從SQL下手.
山不轉路轉,路不轉,我就不玩了..
但目前還在自習 >
請大大們對此構想給點意見吧!!讓小弟少繞點路.
小弟我目前
|
Dip
一般會員 發表:6 回覆:4 積分:2 註冊:2004-04-19 發送簡訊給我 |
嘿~小弟解決了. 速度極快
分享給各位嘗嘗. 原始文件取自完全剖析Microsoft SQL 7.0. Ron Soukup.
-- 用來記錄報告階層與目前雇員的變數 DECLARE @level int, @current int -- 這個表格的作用像是堆疊. 我們將雇員推(push)的堆疊上, -- 直到我們處理完它們的報告. CREATE TABLE #stack (depth_level int, emp_no int) -- 這個暫存表格會用來記錄報告鏈. -- identity自動的將它順過並允許我們 -- 最終以單一的結果集回傳這個階層. CREATE TABLE #orgchart (seq_no int IDENTITY org_level int NOT NULL emp_id int NOT NULL ) -- 假設我們知道確實僅有一個員工 --(CEO)會是他自己的經理人. -- 合理情況下可以修改這個, 但需要一些方法 -- 來知道從何處開始. -- 我們會設定ROWCOUNT為1來確定, 但這不是必要的 -- 因為我們知道這件事. -- 在這個批次中, 我們會假設我們從階層1開始作為 -- depth_level. SET ROWCOUNT 1 SELECT @level=1, @current=emp_no FROM emp_mgr WHERE emp_no=mgr_no SET ROWCOUNT 0 INSERT INTO #stack(depth_level, emp_no)VALUES(@level, @current) WHILE(@level > 0) -- 如果還有剩下任何階層就執行 BEGIN -- 判斷我們所在的階層是否還有任何列 IF EXISTS(SELECT * FROM #stack WHERE depth_level=@level) BEGIN -- 取得目前階層的第一個emp_no SET ROWCOUNT 1 SELECT @current=emp_no FROM #stack WHERE depth_level=@level SET ROWCOUNT 0 -- 將雇員放在暫存表格上以便 -- 稍後我們能夠執行單一的查詢與join. -- 我們可以在這裡對每一個雇員做SELECT, 但是 -- 但這樣的結果集是沒有效率的. -- 這個orgchart暫存表格是自動的順過 -- 藉由identity. 這是暫存表格的關鍵 -- 用來在這裡提供解決方案. INSERT INTO #orgchart(ORG_LEVEL, EMP_ID) SELECT @level, @current --從堆疊中刪除掉剛處理過的列 DELETE FROM #stack WHERE depth_level=@level AND emp_no=@current -- 取得堆疊中的新列藉由找出任何人報告給 -- 目前的: 除了報告給自己的最頂端雇員 INSERT INTO #stack SELECT @level 1, emp_no FROM emp_mgr WHERE mgr_no=@current AND mgr_no <> emp_no -- 如果有任何列被找到並且插入, 會有一個階層 -- 是在這個雇員之下, 所以增加階層 IF @@ROWCOUNT > 0 SELECT @level=@level 1 END ELSE -- 沒有任何階層在這個雇員之下, 所以提出(pop up)一個 SELECT @level=@level- 1 END -- 現在join這個 #org_chart來取得雇員姓名與職稱 -- 將雇員與經理人相接成一個字串, 依照階層來縮排 -- 使用SPACE()*level*5來對每個階層縮排5個字元, 除了 -- 第一層. SELECT "Manager -> Employees"= SPACE((O.org_level - 1)* 5) E.emp_name ', ' E.emp_title FROM #orgchart AS O JOIN emp_mgr AS E ON(E.emp_no=O.emp_id) ORDER BY O.SEQ_NO DROP TABLE #stack, #orgchart結果. Manager -> Employees John Smith, CEO Mark Burke, President Dave Edgerton, VP-Operations Rick Eckhart, Albany Plant Manager |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |