简体   繁体   中英

SQL Server multi LEFT JOIN for same table

I have big data and multiple LEFT JOIN s for same table as below query

I have view AB_AccCard which contains columns [YID] and [YParentID]

what I want is to look for [YID] in [AB_ProcessDetail] and get YParentID from [AB_AccCard] then save it as [YParent]

then get [YParentID] for new [YParent] and save it as [YParent2]

then get [YParentID] for new [YParent2] and save it as [YParent3]

..... want this for 5 level

SELECT
    YPartner = ISNULL(AP.AccName, AC.AccName),
    YPartner2 = ISNULL(AP2.AccName, ISNULL(AP.AccName, AC.AccName)),
    YPartner3 = ISNULL(AP3.AccName, ISNULL(AP2.AccName, ISNULL(AP.AccName, AC.AccName))),
    YPartner4 = ISNULL(AP4.AccName, ISNULL(AP3.AccName, ISNULL(AP2.AccName, ISNULL(AP.AccName, AC.AccName)))),
    YPartner5 = ISNULL(AP5.AccName, ISNULL(AP4.AccName, ISNULL(AP3.AccName, ISNULL(AP2.AccName, ISNULL(AP.AccName, AC.AccName)))))
FROM 
    dbo.[AB_ProcessDetail] A WITH(NOLOCK) 
LEFT JOIN 
    AB_AccCard AC WITH(NOLOCK) ON AC.YID = A.YAccCardId 
                               AND a.DataBaseName = ac.DataBaseName
LEFT JOIN  
    (SELECT YID, AccName, YParentID, AccType, DataBaseName 
     FROM dbo.AB_AccCard WITH(NOLOCK)) AP ON AP.YID = ac.YParentID   
                                          AND AP.DataBaseName = AC.DataBaseName
LEFT JOIN  
    (SELECT YID, AccName, YParentID, AccType, DataBaseName 
     FROM dbo.AB_AccCard WITH(NOLOCK)) AP2 ON AP2.YID = AP.YParentID  
                                           AND AP2.DataBaseName = AC.DataBaseName
LEFT JOIN  
    (SELECT YID, AccName, YParentID, AccType, DataBaseName 
     FROM dbo.AB_AccCard WITH(NOLOCK)) AP3 ON AP3.YID = AP2.YParentID 
                                           AND AP3.DataBaseName = AC.DataBaseName
LEFT JOIN  
    (SELECT YID, AccName, YParentID, AccType, DataBaseName 
     FROM dbo.AB_AccCard WITH(NOLOCK)) AP4 ON AP4.YID = AP3.YParentID 
                                           AND AP4.DataBaseName = AC.DataBaseName
LEFT JOIN  
    (SELECT YID, AccName, YParentID, AccType, DataBaseName 
     FROM dbo.AB_AccCard WITH(NOLOCK)) AP5 ON AP5.YID = AP4.YParentID 
                                           AND AP5.DataBaseName = AC.DataBaseName

It takes a long time to execute.

How can I make it go faster?

I have used OUTER APPLY with FUNCTION

CREATE FUNCTION [dbo].[fnAB_GetPartnerID] (@YParentID varchar(25),@DataBaseName varchar(4) )
RETURNS TABLE
AS
RETURN
( 
SELECT  E.CardType,E.Code,E.AccName,E.YID, E.AccType,E.YParentID,E.DataBaseName
FROM AB_AccCard  E WITH(NOLOCK) 
WHERE e.YID = @YParentID AND E.DataBaseName =@DataBaseName 
)

And the query is

SELECT 
YPartner = ISNULL(AP.AccName,AC.AccName),
YPartner2 = ISNULL(AP2.AccName,ISNULL(AP.AccName,AC.AccName)),
YPartner3 = ISNULL(AP3.AccName,ISNULL(AP2.AccName,ISNULL(AP.AccName,AC.AccName))),
YPartner4 = ISNULL(AP4.AccName,ISNULL(AP3.AccName,ISNULL(AP2.AccName,ISNULL(AP.AccName,AC.AccName)))),
YPartner5 = ISNULL(AP5.AccName,ISNULL(AP4.AccName,ISNULL(AP3.AccName,ISNULL(AP2.AccName,ISNULL(AP.AccName,AC.AccName)))))
FROM [AB_ProcessDetail] A WITH(NOLOCK)
OUTER APPLY  fnAB_GetPartnerID (A.YAccCardId  , A.DataBaseName  ) AC
OUTER APPLY  fnAB_GetPartnerID (ac.YParentID  ,ac.DataBaseName  ) AP
OUTER APPLY  fnAB_GetPartnerID (AP.YParentID  ,AP.DataBaseName  ) AP2
OUTER APPLY  fnAB_GetPartnerID (AP2.YParentID  ,AP2.DataBaseName  ) AP3
OUTER APPLY  fnAB_GetPartnerID (AP3.YParentID  ,AP3.DataBaseName  ) AP4
OUTER APPLY  fnAB_GetPartnerID (AP4.YParentID  ,AP4.DataBaseName  ) AP5

But I still wonder if there is a better way

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