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.