2

Mit SQL versuche ich, eine Liste von IDs eines Benutzers Nachkommen zu erhalten. Also, sagen, ich habe:SQL rekursive CTE gibt mehr Ergebnisse als erwartet zurück

Id | ManagerId | Name 
---|-----------|------ 
4 | NULL  | James Smith 
7 | 4   | John Doe (1) 
8 | 7   | John Doe (2) 
9 | 8   | John Doe (3) 
10 | 8   | John Doe (4) 

Und ich will zurück 4, 7, 8, 9, 10 bekommen. Umsah Online die empfohlene Vorgehensweise ist eine rekursive CTE zu schaffen, die ich als getan habe:

WITH UsersCTE AS (
    SELECT Id, 
      ManagerId 
    FROM Users 
    WHERE IsActive = 1 
    UNION ALL 
    SELECT A.Id, 
      UsersCTE.Id 
    FROM UsersCTE 
      INNER JOIN Users AS A 
       ON A.ManagerId = UsersCTE.ManagerId 
) 

SELECT * 
FROM UsersCTE; 

Welche Art von Werken. Es fängt an, indem es die Ids bekommt, die ich will, und dann geht einfach los und fängt an, Ids in allen Arten von Manieren zu bekommen. Ich gestehe, dass ich keine Ahnung habe, wie es funktioniert, aber es gibt mir nicht das gewünschte Ergebnis. Stattdessen wird es geben diese mir:

enter image description here

Wie kann ich es mir zu geben, nur die IDs ich will. Als Referenz benötige ich diese Liste, damit ich die Datenbank abfragen und eine Liste der Aufträge für die aktuellen Benutzer und alle von ihnen verwalteten Nachkommen abrufen kann. Ich verwende EF6 für den Datenzugriff und plane, dieses CTE zu einer Ansicht zu machen und es entsprechend abzufragen, aber ich bin offen für bessere Empfehlungen.

Antwort

2

Rewrite wie folgt:

WITH UsersCTE AS (
    SELECT Id, 
      ManagerId 
    FROM Users 
    WHERE IsActive = 1 and ManagerID is null 
    UNION ALL 
    SELECT A.Id, 
      UsersCTE.Id 
    FROM UsersCTE 
      INNER JOIN Users AS A 
       ON A.ManagerId = UsersCTE.Id and A.IsActive = 1 
) 

SELECT * 
FROM UsersCTE; 

Der Null-Filter im ersten Teil verankert Ihr CTE das heißt es gibt einen Basisfall von Mitarbeitern ohne Manager. Die andere Änderung ist in der Join-Bedingung des zweiten Teils. Die aktualisierte Bedingung entspricht der Manager-ID der Mitarbeiter-ID.

Demo

+0

Ahhh, ich sehe. Es macht jetzt Sinn. Danke für die Hilfe! – Gup3rSuR4c

+1

Wahrscheinlich möchten Sie 'WHERE IsActive = 1' im rekursiven Element wiederholen. –

+0

Oh ja, natürlich. Überlief es früher! –

Verwandte Themen