iT邦幫忙

0

SQL 寫法協助

sql
  • 分享至 

  • xImage

有一 Table 資料如下 EMPID為員工編號, EmpName為員工姓名, EmpBoss為主管ID
EmpBoss 空白表示是老闆

有無比較好的SQL寫法 可以將我要查詢的 EMPID 其 下屬以及下屬的下屬全數抓取出來
例如
我要查 Bill的下屬 及其下屬的下屬 如下圖

其結果可以找出 Bill所管轄的全部員工為 Eve,Huffman,Ivan, Frank
請協助提供SQL寫法
或有無其他方式可以達到上述的目的

謝謝各位

列出所有下線

感覺起來
多層次傳銷公司也可以派上用場
忙
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
4
wiseguy
iT邦超人 1 級 ‧ 2012-03-03 11:29:28
最佳解答

假設你們公司層級只有四層,所以這樣寫就可以抓出全公司層級:

<pre class="c" name="code">select E1.EmpName,E2.EmpName,E3.EmpName,E4.EmpName
from EMP as E1
left join EMP as E2 on E1.EmpID=E2.EmpBoss
left join EMP as E3 on E2.EmpID=E3.EmpBoss
left join EMP as E4 on E3.EmpID=E4.EmpBoss
where E1.EmpBoss ='';

如果只要查 Bill,那只需寫:

<pre class="c" name="code">select E2.EmpName,E3.EmpName,E4.EmpName
from EMP as E2
left join EMP as E3 on E2.EmpID=E3.EmpBoss
left join EMP as E4 on E3.EmpID=E4.EmpBoss
where E2.EmpName ='Bill';
ooctiger iT邦新手 5 級 ‧ 2012-03-03 14:49:38 檢舉

再請教
如不知有多少層級的情況下
有無其他的作法 ?

Albert iT邦高手 1 級 ‧ 2012-03-03 16:55:21 檢舉

寫 procedure 自我呼叫 可以 9999.... 階都沒問題
但是我們還是會設無限循環檢核
防止設錯關聯造成無限迴圈

wiseguy iT邦超人 1 級 ‧ 2012-03-03 17:58:30 檢舉

一般不建議以不明層級的方式去查詢,原因就是 albertachen 所說的,假如有個人的上司打錯了的話,有可能造成無窮迴圈,然後資料庫就掛了。
而且假如有人很白目,一直大量查詢,對資料庫也是效能殺手。
一般實務上,如果整個架構不知道有幾層,都只會往下查一級,然後點了某個葉節點之後,再往下查一級,如此下去,就像 MSDN 的樹狀結構一樣。

2
外獅佬
iT邦大師 1 級 ‧ 2012-03-03 23:17:36

如果是SQL Server 2008....可以考慮使用cte...
Common Table Expressions

2
player
iT邦大師 1 級 ‧ 2012-03-04 10:28:08

select * from EMP
先用ADO.NET整個讀到 DataTable Dt

在ASP.NET裡用
string filterExpr = string.Format("EmpBoss = '{0}'", strEmpBoss);
DataRow [] rows = Dt.Select(filterExpr);
自己去處理遞回
一次抓一層

這樣要幾層都OK
但是一樣要檢查資料錯誤導致的無限遞回問題

2
mattchen11
iT邦新手 5 級 ‧ 2012-03-05 13:57:16

--cte recursive

;WITH Emp_CTE AS (
SELECT EmpID, EmpName,EmpBoss
FROM Employee
WHERE EmpName='Bill'
UNION ALL
SELECT e.EmpID, e.EmpName, e.EmpBoss
FROM Employee e
INNER JOIN Emp_CTE ecte ON ecte.EmpID = e.EmpBoss
)
SELECT *
FROM Emp_CTE;

我要發表回答

立即登入回答