2015-04-17 57 views
0

我有一個查詢,我正在查找我們的員工表中的用戶,並遞歸地瀏覽記錄以找出報告給我們源輸入的每個人。來自多個來源的TSQL遞歸

我的問題是,而不是傳遞一個單一的值,在下面的情況下,@QID Id喜歡能夠傳遞多個值。我試圖修改它說WHERE QID IN ('user1', 'user2')但它始終只返回的數據爲它IN條款

WITH empList(mgrQID, QID, NTID, FullName, lvl, countOfDirects) 
AS 
(
     SELECT TOP 1 mgrQID, QID, NTID, FirstName+' '+LastName, 0, CountOfDirects 
     FROM dbo.EmployeeTable 
     WHERE QID = @QID 

     UNION ALL 

     SELECT b.mgrQID, b.QID, b.NTID, b.FirstName+' '+b.LastName, lvl+1, b.countOfDirects 
     FROM empList a 
     CROSS APPLY dbo.Fetch_Directs_by_qid(a.QID)b 
) 
+0

如果你做一個'WHERE QID IN(「用戶1」,「用戶2」)'和'留下SELECT TOP 1'然後錨查詢將只返回一條記錄。這個單一記錄是遞歸鏈中唯一的輸入。 –

回答

0

擺脫TOP 1中找到的第一個用戶,並像這樣做。如果您有重複的值,通過將組添加到您的錨查詢或DISTINCT

DECLARE @QID TABLE (val VARCHAR(100)); 
INSERT INTO @QID VALUES ('user1'),('user2') 

WITH empList(mgrQID, QID, NTID, FullName, lvl, countOfDirects) 
AS 
(
     SELECT mgrQID, QID, NTID, FirstName+' '+LastName, 0, CountOfDirects 
     FROM dbo.EmployeeTable 
     WHERE QID IN (SELECT * FROM @QID) 

     UNION ALL 

     SELECT b.mgrQID, b.QID, b.NTID, b.FirstName+' '+b.LastName, lvl+1, b.countOfDirects 
     FROM empList a 
     CROSS APPLY dbo.Fetch_Directs_by_qid(a.QID)b 
) 
+0

這個遞歸是否會在退出循環之前爲每個用戶運行?例如,在此之後,我將有一個插入查詢將數據放入臨時表中。如果有的話,我想防止重複。但是,如果我在工會結束後在選擇條款中加入了「DISTINCT」,我不知道它是否會捕獲它們?這有任何意義嗎? – SBB

+0

很難說,因爲您在交叉應用中使用函數,而我不知道您的數據結構。但如果你原來的查詢爲1人工作,那麼這應該工作正常。我剛剛提到你不想在第一個select語句中有重複項,因爲它會返回重複項,因爲它會多次找到同一個人的父項子項。你可能不必擔心它。如果您不確定這是否可行,請將一些值加載到臨時表中並運行我的查詢。看看它是否按計劃運作。 – Stephan

+0

嗯沒關係;交叉應用只是讓所有直接向'QID'報告的人傳遞給它。如果我選擇鮑勃誰是經理,我也選擇鮑勃經理吉姆,它會讓我每個人都報告給鮑勃和每個報告給吉姆的人。在這個事業中,它將包含重複的內容,我只是想知道是否有辦法在遞歸內部阻止它自己。例如,如果它們不存在於此遞歸函數的數據集中,則只能獲取它們。 – SBB