2014-10-05 210 views
1

我在我的工具中使用了2個表。TSQL遞歸查詢

一個是員工數據庫,另一個是包含每個直接報告人數的直接報告數的表。

以下是我已經設置了樣本表: http://sqlfiddle.com/#!6/0b414/3

下面是一個簡單的查詢我的工作。但是,我需要做的是將記錄插入到另一個表中,並記錄每個人的指示數。

如果他們沒有直接的,他們不會被添加到表中。

;WITH employees_CTE (FirstName, LastName, QID, Email, SupQID, Title) AS 
    (
     SELECT  FirstName, 
        LastName, 
        QID, 
        Email, 
        SupQID, 
        Title 
     FROM  employees E 
     WHERE  QID = 'Q12345' 

     UNION ALL 

     SELECT  E.FirstName, 
        E.LastName, 
        E.QID, 
        E.Email, 
        E.SupQID, 
        E.Title 
     FROM  employees E 
     INNER JOIN employees_CTE AS E2 ON E.SupQID = E2.QID 
     --Some type of INSERT statement here if the number of people reporting to you are greater than zero. 
    ) 

CTE就我所能得到的。我被困在搞清楚如何從CTE中獲得計數,所以我知道是否將它插入到table2中。

直接報告是某人的SupQID是您自己的。 supQID字段是員工的主管(直接)。

任何想法?

編輯:需要遞歸執行此操作而不是通過連接執行此操作的原因是爲了節省空間:並非所有部門都需要此類跟蹤,並且能夠說「通過X報告的任何人」會留下選項如果有需要的話,可以打開將來打開它,或者增加部門。

+0

SQL小提琴很好,但您至少可以設置它,使字段名稱與示例查詢匹配。 – 2014-10-05 20:06:23

+0

對不起,修正:http://sqlfiddle.com/#!6/ff315 – SBB 2014-10-05 20:08:18

回答

1

我們chat regarding the reason to want to do this recursively後,必須主要問題是在查詢的遞歸部分沒有聚合函數。

因此,你可以在你的結果做一個更加入到當您從CTE選擇,就像這樣:

;WITH employees_CTE (First, Last, QID, Email, Supervisor, Title) AS 
    (
     SELECT  First, 
        Last, 
        QID, 
        Email, 
        Supervisor, 
        Title 
     FROM  employees E 
     WHERE  QID IN ('Q24285', 'Q07341') 

     UNION ALL 

     SELECT  E.First, 
        E.Last, 
        E.QID, 
        E.Email, 
        E.Supervisor, 
        E.Title 
     FROM  employees E 
     INNER JOIN employees_CTE AS E2 ON E.Supervisor = E2.QID 

     --Some type of INSERT statement here if the number of people reporting to you are greater than zero. 
    ) 
SELECT C.First, C.Last, C.QID, C.EMAIL, C.Supervisor, C.Title, COUNT(DISTINCT E.QID) AS CountOfDirects 
FROM employees_CTE C 
    INNER JOIN Employees E ON E.Supervisor = C.QID 
GROUP BY C.First, C.Last, C.QID, C.EMAIL, C.Supervisor, C.Title 
; 

參見SQLFiddle結果。

這提供了一個框架,可以很容易地適應您的需求。你可以包裝一個關於這個的過程聲明,並將你想要捕獲的QID作爲參數提供給feed,然後只需將insert語句添加爲最終select語句的一部分,並且你是黃金版。

+0

你想要包含聊天鏈接的機會嗎?開篇評論令人困惑,因爲沒有人會理解這篇文章。 – Taryn 2014-10-06 16:13:19

+1

完成。花了一點時間找我再次找到它。 – 2014-10-06 16:21:35

1

試試這個:

select E.Title,COUNT(*) CountofDirects,E.First,E.Last from Employees E 
JOIN Employees EE 
ON E.QID=EE.Supervisor 
GROUP BY E.Title,E.First,E.Last 

與INSERT INTO

INSERT INTO TABLE2(Title,CountofDirects,First,Last) 
select E.Title,COUNT(*) CountofDirects,E.First,E.Last from Employees E 
JOIN Employees EE 
ON E.QID=EE.Supervisor 
GROUP BY E.Title,E.First,E.Last 

SQL FIDDLE

+0

所以小提琴看起來就像指揮的人數一樣多;但我對你的其他2個查詢有點困惑。是否可以將插入添加到你的小提琴?我已經在那裏建立了table2結構。 – SBB 2014-10-05 20:11:03

+0

不明白'指示每個人的數量''。你是指'董事數量? – 2014-10-05 20:16:35

+0

我提供了一個查詢'插入一個記錄到另一個表中,每個人都有指示計數(從基於QID的表2中計數)# – 2014-10-05 20:19:33