2008-12-18 185 views
0

嗨,我很新的SQL,但已通過一個工作,我需要查詢分貝(MS SQL 2005年)我需要返回所有工作人員在哪裏給一個HeadID(表格) 所以我需要獲得與HeadID匹配的所有經理,然後獲取由ManagerID匹配這些經理的所有員工。我將如何做到這一點?任何幫助或任何SQL術語,這將幫助我更好地搜索解決方案將不勝感激。 由於嵌套Select語句?

tb_Head: HeadID

tb_Manager: 經理ID, HeadID,

tb_Worker: WorkerID, 經理ID,

回答

2

一個簡單的方法是做這樣的事情:

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> 

調整您的表名稱並選擇適當的列。

+0

謝謝。不錯,很簡單。讚賞 - 喜歡頭髮 - btw。 – user17510 2008-12-18 07:40:19

1

使用公用表表達式

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 
0

聽起來就像你想使用遞歸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 ,級別)部分,並在聲明的第一部分給予持有人。