2015-04-17 27 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