简体   繁体   中英

Tree structure data approval hierarchy query

I have some tables, let's call them table ApprovalHierarchy

ID  GroupApp            ParentID
1   Project             NULL
2   Leader Mechanical   1
3   Engineer Mechanical 2
4   Leader Electrical   1
5   Engineer Electrical 4

And this is table GroupMember

ID GroupID  Username  Password
1   1        Frey      12345 
2   2        Anne      12345       
3   2        Bryan     12345
4   3        Belle     12345
5   3        Will      12345
6   4        Drio      12345
7   5        Maxio     12345
8   5        James     12345 

GroupID is a column which contains id from table ApprovalHierarchy , for example Username : Frey have GroupID : 1 that is Frey as Project

And I have one more table, let's call them table Mailbox , and in column Approval this is the output that I meant. I need to insert/update column Approval , if FromUser and also same with Username have GroupID and have ParentID , I want write that Username in column Approval , this is for example the output that I want in column Approval :

ID FromUser ToUser  Message  Approval
1  Belle    Client  Hello    Anne, Bryan
2  Anne     Client  Hai      Frey
3  Maxio    Client  Hii      Drio
4  Drio     Client  hey      Frey

This is for table Mailbox

This is the query in table Mailbox that I meant

CREATE TABLE Mailbox (
    ID INT
    ,FromUser NVARCHAR(100)
    ,ToUser NVARCHAR(100)
    ,Message NVARCHAR(100)
    ,Approver NVARCHAR(100)
    )
INSERT INTO dbo.Mailbox
VALUES
(1,'Belle','Client','Hello',' '),
(2, 'Anne', 'Client', 'Hai', ' '),
(3,  'Maxio', 'Client', 'Hii', ' '),
(4, 'Drio', 'Client' , 'hey', ' ') 

ID FromUser ToUser  Message  Approval
1  Belle    Client  Hello    Group 2
2  Anne     Client  Hai      Group 1
3  Maxio    Client  Hii      Group 4
4  Drio     Client  hey      Group 1

Here is the query. DBFIDDLE working code

SELECT a.ID
    ,a.[From User]
    ,a.[To User]
    ,a.Message
    ,ISNULL(SUBSTRING(a.Approver, 0, LEN(a.Approver)), 'No Approver Exists') [Approver]
FROM (
    SELECT Id
        ,Username [From User]
        ,'Client' [To User]
        ,'Hi' [Message]
        ,(
            SELECT gm.Username + ',' [text()]
            FROM dbo.ApprovalHierarchy ah
            JOIN dbo.GroupMember gm ON ah.ParentID = gm.GroupID
            WHERE ah.Id = gmm.GroupID
            FOR XML PATH('')
                ,TYPE
            ).value('.', 'NVARCHAR(MAX)') [Approver]
    FROM dbo.GroupMember gmm
    ) a

Update Query:

UPDATE m
SET m.Approver = ISNULL(SUBSTRING(a.Approver, 0, LEN(a.Approver)), 'No Approver Exists')
FROM (
    SELECT Id
        ,Username
        ,'Client' [To User]
        ,'Hi' [Message]
        ,(
            SELECT gm.Username + ', ' [text()]
            FROM dbo.ApprovalHierarchy ah
            JOIN dbo.GroupMember gm ON ah.ParentID = gm.GroupID
            WHERE ah.Id = gmm.GroupID
            FOR XML PATH('')
                ,TYPE
            ).value('.', 'NVARCHAR(MAX)') [Approver]
    FROM dbo.GroupMember gmm
    ) a
INNER JOIN dbo.Mailbox m ON a.Username = m.FromUser

SELECT *
FROM dbo.Mailbox

Update Query to update the Group {GroupId}

UPDATE m
SET m.Approver = IIF(a.Approver = 'Group ', 'No Approver Exists', a.Approver)
FROM (
    SELECT gmm.Id
        ,Username
        ,'Client' [To User]
        ,'Hi' [Message]
        ,'Group ' + CAST(ah.ParentId AS NVARCHAR(MAX)) [Approver]
    FROM dbo.GroupMember gmm
    INNER JOIN dbo.ApprovalHierarchy ah ON gmm.GroupId = ah.Id
    ) a
INNER JOIN dbo.Mailbox m ON a.Username = m.FromUser

Select Results:

在此处输入图片说明

Results from Mailbox after update:

在此处输入图片说明 在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM