2008-12-18 9 views
0

Salut Je suis très nouveau à sql mais j'ai passé un travail dans lequel j'ai besoin d'interroger la base de données (MS SQL 2005) J'ai besoin de retourner tous les travailleurs où un HeadID est donné (tableaux ci-dessous) obtenir tous les gestionnaires qui correspondent à l'ID de la tête, puis tous les travailleurs qui correspondent à ces gestionnaires par ID de gestionnaire. Comment ferais-je cela? Toute aide ou toute terminologie SQL qui m'aiderait à mieux rechercher la solution serait très appréciée. MerciNested Sélectionnez l'instruction?

tb_Head: HeadID

tb_Manager: ManagerID, HeadID,

tb_Worker: WorkerID, ManagerID,

Répondre

2

Un moyen simple serait de faire quelque chose comme ceci:

select * from tb_Worker 
    join tb_Manager on tb_Worker.ManagerID = tb_Manager.ManagerID 
    join tb_Head on tb_Manager.HeadID = Head.HeadID 
    where tb_Head.HeadID = <given value> 

Réglez vos noms de table et sélectionnez les colonnes appropriées.

+0

Merci Nice et simple Apprécié - Love the hair -btw. – user17510

1

Utiliser l'expression de table commune

USE AdventureWorks; 
GO 
WITH DirectReports(ManagerID, EmployeeID, EmployeeLevel) AS 
(
    SELECT ManagerID, EmployeeID, 0 AS EmployeeLevel 
    FROM HumanResources.Employee 
    WHERE ManagerID IS NULL 
    UNION ALL 
    SELECT e.ManagerID, e.EmployeeID, EmployeeLevel + 1 
    FROM HumanResources.Employee e 
     INNER JOIN DirectReports d 
     ON e.ManagerID = d.EmployeeID 
) 
SELECT ManagerID, EmployeeID, EmployeeLevel 
FROM DirectReports ; 
GO 
0

On dirait que vous voulez utiliser un CTE récursif. Le books online article parle de votre type de scénario. Voici un ensemble d'échantillons de code que je viens d'utiliser dans un article stackoverflow différent ...

CREATE TABLE dbo.ctetest (employeeid int primary key not null, managerid int null); 

INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 1, NULL; 
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 2, 1; 
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 3, 1; 
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 4, 2; 
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 5, 2; 
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 6, 3; 
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 7, 2; 
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 8, 5; 
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 9, 4; 
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 10, 6; 
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 11, 6; 

WITH recursivecte (employeeid, managerid, level) 
AS 
(SELECT employeeid 
    , managerid 
    , 'level' = 0 
FROM dbo.ctetest 
WHERE managerid IS NULL 
UNION ALL 
SELECT ct.employeeid 
    , ct.managerid 
    , 'level' = rc.level + 1 
FROM dbo.ctetest ct 
JOIN recursivecte rc 
    ON ct.managerid = rc.employeeid) 

SELECT * 
FROM recursivecte rc 

Cela devrait vous donner la hiérarchie de chaque employé d'un niveau à. Si vous souhaitez renvoyer des informations sur le niveau supérieur suivant, par exemple un nom de gestionnaire, il vous suffit d'ajouter rc.managername à la deuxième partie de UNION ALL, ajouter des colonnes à la table CTE (c'est le WITH recursivecte (employeeid, managerid , niveau) section, et donner des place-titulaires dans la première partie de la déclaration