嗨,我很新的SQL,但已通過一個工作,我需要查詢分貝(MS SQL 2005年)我需要返回所有工作人員在哪裏給一個HeadID(表格) 所以我需要獲得與HeadID匹配的所有經理,然後獲取由ManagerID匹配這些經理的所有員工。我將如何做到這一點?任何幫助或任何SQL術語,這將幫助我更好地搜索解決方案將不勝感激。 由於嵌套Select語句?
tb_Head: HeadID
tb_Manager: 經理ID, HeadID,
tb_Worker: WorkerID, 經理ID,
嗨,我很新的SQL,但已通過一個工作,我需要查詢分貝(MS SQL 2005年)我需要返回所有工作人員在哪裏給一個HeadID(表格) 所以我需要獲得與HeadID匹配的所有經理,然後獲取由ManagerID匹配這些經理的所有員工。我將如何做到這一點?任何幫助或任何SQL術語,這將幫助我更好地搜索解決方案將不勝感激。 由於嵌套Select語句?
tb_Head: HeadID
tb_Manager: 經理ID, HeadID,
tb_Worker: WorkerID, 經理ID,
一個簡單的方法是做這樣的事情:
select * from tb_Worker
join tb_Manager on tb_Worker.ManagerID = tb_Manager.ManagerID
join tb_Head on tb_Manager.HeadID = Head.HeadID
where tb_Head.HeadID = <given value>
調整您的表名稱並選擇適當的列。
使用公用表表達式
USE AdventureWorks;
GO
WITH DirectReports(ManagerID, EmployeeID, EmployeeLevel) AS
(
SELECT ManagerID, EmployeeID, 0 AS EmployeeLevel
FROM HumanResources.Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT e.ManagerID, e.EmployeeID, EmployeeLevel + 1
FROM HumanResources.Employee e
INNER JOIN DirectReports d
ON e.ManagerID = d.EmployeeID
)
SELECT ManagerID, EmployeeID, EmployeeLevel
FROM DirectReports ;
GO
聽起來就像你想使用遞歸CTE。 books online article談論你的情況。下面是我剛在不同的計算器文章中使用的代碼樣本集...
CREATE TABLE dbo.ctetest (employeeid int primary key not null, managerid int null);
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 1, NULL;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 2, 1;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 3, 1;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 4, 2;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 5, 2;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 6, 3;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 7, 2;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 8, 5;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 9, 4;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 10, 6;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 11, 6;
WITH recursivecte (employeeid, managerid, level)
AS
(SELECT employeeid
, managerid
, 'level' = 0
FROM dbo.ctetest
WHERE managerid IS NULL
UNION ALL
SELECT ct.employeeid
, ct.managerid
, 'level' = rc.level + 1
FROM dbo.ctetest ct
JOIN recursivecte rc
ON ct.managerid = rc.employeeid)
SELECT *
FROM recursivecte rc
這應該給你從一級到一級每位員工的層次結構。如果您想返回有關下一個最高級別的信息,例如經理姓名,那麼您只需要將rc.managername添加到UNION ALL的第二部分,向CTE表中添加列(即WITH recursivecte(employeeid,managerid ,級別)部分,並在聲明的第一部分給予持有人。
謝謝。不錯,很簡單。讚賞 - 喜歡頭髮 - btw。 – user17510 2008-12-18 07:40:19