2017-09-18 68 views
0

我有一張帶有公司組織結構樹的表格。以遞歸方式檢索包含在服務中的用戶

enter image description here

類型0:服務|類型1:用戶

* Global Service 
    * Logisticians 
     > Mike 
     > George 
    * Technicians 
     * Drivers 
     > Stef 
     > John 
     * Controllers 
     > Alfred 

我需要檢索給定服務的所有用戶。

例子:

In: 0 Out: 5, 6, 7, 8, 9 
In: 1 Out: 5, 6 
In: 2 Out: 7, 8, 9 
In: 3 Out: 7, 8 
In: 4 Out: 9 

我如何查詢我的表參數(服務ID),並讓所有用戶包括作爲一個結果呢?

輸入:該服務的ID來查詢

輸出:用戶的ID包含在該服務

回答

0

弗里斯特創建一個數據類型來保存表

create type testTypeM as table (Id int , Name varchar(30), ParentId int, Type bit) 
創建遞歸函數以獲得層次結構

裝載表到表中的數據類型

DECLARE @TableSrc testTypeM 
Insert @TableSrc (Id,Name, ParentId, Type) Values 
(0, 'Global Service', NULL, 0) 
,(1, 'Logisticians', 0 ,0) 
,(2, 'Technicians', 0 ,0) 
,(3, 'Drivers', 2, 0) 
,(4, 'Controllers', 2, 0) 
,(5, 'Mike', 1, 1) 
,(6, 'George',1,1) 
,(7, 'Stef', 3, 1) 
,(8, 'John', 3, 1) 
,(9, 'Alfred', 4, 1) 


-- In Prosduction 
--INSERT @TableSrc 
--SELECT * FROM Your table 

使用,因爲它

SELECT * FROM dbo.TestFuncM(0, @TableSrc) WHERE TYPE = 1; 

Id   Name       ParentId Type 
----------- ------------------------------ ----------- ----- 
5   Mike       1   1 
6   George       1   1 
7   Stef       3   1 
8   John       3   1 
9   Alfred       4   1 

SELECT * FROM dbo.TestFuncM(1, @TableSrc) WHERE TYPE = 1; 
Id   Name       ParentId Type 
----------- ------------------------------ ----------- ----- 
5   Mike       1   1 
6   George       1   1 

SELECT * FROM dbo.TestFuncM(2, @TableSrc) WHERE TYPE = 1; 
Id   Name       ParentId Type 
----------- ------------------------------ ----------- ----- 
7   Stef       3   1 
8   John       3   1 
9   Alfred       4   1 

SELECT * FROM dbo.TestFuncM(3, @TableSrc) WHERE TYPE = 1; 
Id   Name       ParentId Type 
----------- ------------------------------ ----------- ----- 
7   Stef       3   1 
8   John       3   1 

SELECT * FROM dbo.TestFuncM(4, @TableSrc) WHERE TYPE = 1; 
Id   Name       ParentId Type 
----------- ------------------------------ ----------- ----- 
9   Alfred       4   1 

SELECT * FROM dbo.TestFuncM(5, @TableSrc) WHERE TYPE = 1; 
-- No Result`enter code here` 
+0

您的解決方案的工作,但我不能在我的SQL SERVER上引入用戶定義的函數。是否有可能只使用SQL查詢?不管怎麼說,還是要謝謝你。 – Bronzato

+0

你可以嘗試使用物理表並創建一個循環來模擬函數行爲,在lanch之後,如果沒有人回答它,我會嘗試創建一些東西。 –

+0

我使用LOOP創建了一個新答案。很容易適應程序 –

0

如果您不能創建數據類型使用下面的代碼創建一個過程

結果相同

DECLARE @YourTable table (Id int , Name varchar(30), ParentId int, Type bit) 


Insert @YourTable values 
(0, 'Global Service', NULL, 0) 
,(1, 'Logisticians', 0 ,0) 
,(2, 'Technicians', 0 ,0) 
,(3, 'Drivers', 2, 0) 
,(4, 'Controllers', 2, 0) 
,(5, 'Mike', 1, 1) 
,(6, 'George',1,1) 
,(7, 'Stef', 3, 1) 
,(8, 'John', 3, 1) 
,(9, 'Alfred', 4, 1) 


-- CREATE PROCEDURE ProcedureName 
DECLARE @ServiceId int -- Procedure Paramter 


DECLARE @ExistsNextLevel bit = 1 
DECLARE @TableResult table (Id int , Name varchar(30), ParentId int, Type bit) 

--- Remove this line in procedure 
SET @ServiceId = 1 

INSERT @TableResult SELECT * FROM @YourTable WHERE Parentid = @ServiceId 

WHILE (@ExistsNextLevel = 1) 
BEGIN 

    SET @ExistsNextLevel = 0 
    IF EXISTS(SELECT 1 FROM @YourTable A WHERE EXISTS (SELECT 1 FROM @TableResult B WHERE A.Parentid = B.id) 
    AND NOT EXISTS (SELECT 1 FROM @TableResult c Where A.id = C.id)) 
    BEGIN 
     SET @ExistsNextLevel = 1 
    END 

    INSERT @TableResult 
    SELECT * FROM @YourTable A WHERE EXISTS (SELECT 1 FROM @TableResult B WHERE A.Parentid = B.id) 
    AND NOT EXISTS (SELECT 1 FROM @TableResult c Where A.id = C.id) 

END 


SELECT * FROM @TableResult WHERE Type = 1 
-- GO 

-- EXEC ProcedureName @ServiceId = 1 
相關問題