簡體   English   中英

兩張表之間的SQL hiearchy select查詢

[英]SQL hiearchy select query between two tables

我有2張桌子(人,部門)。

部門表如下所示:

ID (int)
Name (varchar)
ParentID (int)

人物表如下:

Id (int)
FirstName (varchar)
SureName (varchar)
DepartmentId (int)
Manager (Bool)
Asistant (Bool)

我需要創建查詢,該查詢選擇混凝土部門經理的混凝土人的所有直接下屬。 一個查詢不僅選擇了經理的直接下屬,而且還選擇了所有查詢。 每個部門都有一名經理和一名助理。 經理==假的人是直接下屬,處於子公司中的人是父母中的下屬。

我不知道如何在SQL / LINQ中創建此查詢。

我將不勝感激!

示例:部門

Id   Name          Parent
0    Department1   null
1    Department2   0
2    Department3   1

例:

People
ID    Name      Department    DepartmentId    Manager    Asistant
1     Martin    Joshua            0             1           0
2     Ondra     Joshua2           0             0           0
3     Petr      Joshua3           0             0           0
4     Todd      Joshua3           1             1           0
5     Alex      Joshua3           1             0           0
6     Iva       Joshua3           1             0           0
7     Otto      Joshua3           2             1           0
8     Todd      Joshua3           2             0           0

例如,我需要選擇ID為0的部門中所有(不僅是直接的)經理下屬,結果如下所示:

2     Ondra     Joshua2           0             0           0
3     Petr      Joshua3           0             0           0
4     Todd      Joshua3           1             1           0
5     Alex      Joshua3           1             0           0
6     Iva       Joshua3           1             0           0
7     Otto      Joshua3           2             1           0
8     Todd      Joshua3           2             0           0

我不確定直接下屬的SQL查詢:

SELECT * FROM dbo.PeopleView WHERE DepartmentId = 162 AND Manager = 0; -- all direct s (162)

解:

;WITH CTE AS
(
    SELECT 1 as EMPLEVEL, H1.Id, H1.ParentId, H1.Name FROM DepartmentView H1 WHERE Id = 6
    UNION ALL
    SELECT EMPLEVEL + 1, H2.Id, H2.ParentId, H2.Name FROM DepartmentView H2
    INNER JOIN CTE ON H2.ParentId = CTE.Id
)
SELECT DISTINCT P.Id, P.LastName,P.FirstName,P.DepartmentId,P.Manager,P.Assistant FROM CTE as T JOIN PeopleView as P on T.Id = P.DepartmentId;

除了第一個查詢外,就像@Andrew的評論中所述,遞歸查詢可以幫助您:

;WITH CTE
AS
(
SELECT ID,FirstName,SureName,DepartmentID,Manager,Assistant, 0 AS EMPLEVEL  FROM PEOPLE A  WHERE DepartmentId = 1 AND Manager = 0
UNION ALL 
SELECT B.ID,B.FirstName,B.SureName,B.DepartmentID,B.Manager,B.Assistant,EMPLEVEL +1 FROM PEOPLE B 
INNER JOIN DEPARTMENT D
ON B.DepartmentID = D.ID
INNER JOIN CTE 
ON D.ParentID = CTE.DepartmentID 
)
SELECT DISTINCT * FROM CTE 

為了轉換為LINQ,您可以閱讀這篇文章:P: linq-to-sql中的通用表表達式(CTE)?

希望對您有幫助,最好的問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM