2009-08-30 7 views
1

J'ai une table auto-référencement (clients) et une table qui reliera à un enregistrement dans ce tableau (Entreprises) à savoirHierarchial SQL Query

Customers  Companies 
*********  ********* 
ID    ID 
ManagerID --> DirectorID 

ManagerID fait référence à un autre enregistrement dans la table des clients.

Je dois effectuer une requête où, en donnant un identifiant client spécifique, elle trouvera la société à laquelle ce client appartient. Si je devais le faire en C#, il ressemblerait à quelque chose comme (ce qui est un exemple de code, non fonctionnel):

public static Company FindCompany(Customer customer) 
{ 
    while (customer.ManagerID != null) 
    { 
      customer = customer.GetManager(); 
    } 
    return Company.FindByDirector(customer.ID); 
} 

Donc il y a 2 étapes:

1) Traverse la table des clients (via ManagerID) jusqu'à ce que nous trouvions un client sans gestionnaireID. (Le Directeur)

2) Trouvez la Société relative à ce Client.

Quelqu'un peut-il m'aider?

Merci.

Répondre

3

Quelque chose comme ceci, non testé cependant.

Basé sur CTEs Recursive Queries Using Common Table Expressions

WITH cTE AS 
(
    SELECT --Get manager of given customer 
     ManagerID 
    FROM 
     Customers 
    WHERE 
     ID = @MyCustomerID 
    UNION ALL 
    SELECT --Get manager of the manager etc 
     Customers.ManagerID 
    FROM 
     cTE 
     JOIN 
     Customers ON cTE.ManagerID = Customers.ID 
) 
SELECT 
    * 
FROM 
    cTE 
    JOIN 
    Company ON cTE.ManagerID = Company.DirectorID 
+2

+1 - sont CTEs le chemin à parcourir dans SQL Server 2005 partir pour la construction des hiérarchies –

+0

je peaufiné ce un peu et ai eu à travailler grâce. Cette requête est-elle possible avec LINQ? – James

+0

@ James: désolé, je ne sais pas. – gbn