簡體   English   中英

如何實現左外部聯接?

[英]How to implement left outer join?

我有這個查詢我想實現左外部聯接我該怎么做

SELECT A.cl_id, A.cl_name, A.number_of_orders, B.Dispatch
FROM (
    SELECT CL_Clients.cl_id, CL_Clients.cl_name,COUNT(*) AS number_of_orders
    FROM CL_Clients,CLOI_ClientOrderItems
    WHERE CL_Clients.cl_id = CLOI_ClientOrderItems.cl_id
    GROUP BY CL_Clients.cl_name,CL_Clients.cl_id
    ) A
, (
    SELECT CL_Clients.cl_id,count(*) AS Dispatch
    FROM CLOI_ClientOrderItems,CL_Clients
    WHERE cloi_current_status = '12'  
        AND CL_Clients.cl_id = CLOI_ClientOrderItems.cl_id
    GROUP BY CL_Clients.cl_name,CL_Clients.cl_id, CLOI_ClientOrderItems.cloi_current_status
    ) B

WHERE A.cl_id = B.cl_id 

預期產量

Cl_id    | Cl_name       |Builtorder |Dispatch
------------------------------------------------
admin    |admin 1    |0      |20
agar     |Agar Murdoch   |102        |1 
Alexander|Alexander James|33         |65    
alexandra|Alexandra West |64         |14    
Archer   |Archer & Co    |0      |5
asbank   |Stirling       |80         |8 
asnapebr |Andrew Snape   |183        |1 
asnapech |Andrew Snape Ch|213        |0 

我認為您的完整查詢可以用很少的幾行寫,請嘗試下面的代碼。

第一種方式,單聯接就是全部!

Select a.cl_id
        ,a.cl_name
        ,count(b.cl_id) as number_of_orders
        ,Sum(Case When b.cloi_current_status ='12' 
                           --and Condition1 and condition2
                     Then 1 else 0 end) as Dispatch
    from CL_Clients as a
    left join CLOI_ClientOrderItems as b on a.cl_id = b.cl_id
 group by a.cl_id
        ,a.cl_name

第二種方式,多個聯接

Select a.cl_id
        ,a.cl_name
        ,Isnull(orderTable.orders,0) as number_of_orders
        ,ISNULL(dTable.Dispatch,0) as Dispatch
    from CL_Clients as a
    outer apply 
        (
            select b.cl_id,count(b.cl_id) as orders from  CLOI_ClientOrderItems as b 
            where a.cl_id = b.cl_id 
            group by b.cl_id
        )as orderTable 
    outer apply
        (
            select d.cl_id,count(*) as Dispatch from CLOI_ClientOrderItems as d
            where a.cl_id = d.cl_id
                and d.cloi_current_status ='12' 
                --and condition2
                --and condition3
                --..............
                --and condition250
            group by a.cl_id
        )as dTable

在上面的語句中,使用first join作為orderTable來獲取訂單數。 作為dTableis第二個dTableis用於獲取已調度的訂單數,它可以包含您所要求的多個條件, -----Condition2 .....是虛擬文本,您可以刪除所有注釋,例如Condition2,Condition3 ..並提出您的實際情況。

這是您在TSQL中的處理方式,但是@ AK47具有解決您較大問題的解決方案。

SELECT A.cl_id, A.cl_name, A.number_of_orders, B.Dispatch
FROM (
    SELECT CL_Clients.cl_id, CL_Clients.cl_name,COUNT(*) AS number_of_orders
    FROM CL_Clients,CLOI_ClientOrderItems
    WHERE CL_Clients.cl_id = CLOI_ClientOrderItems.cl_id
    GROUP BY CL_Clients.cl_name,CL_Clients.cl_id
    ) A
LEFT OUTER JOIN (
    SELECT CL_Clients.cl_id,count(*) AS Dispatch
    FROM CLOI_ClientOrderItems,CL_Clients
    WHERE cloi_current_status = '12'  
        AND CL_Clients.cl_id = CLOI_ClientOrderItems.cl_id
    GROUP BY CL_Clients.cl_name,CL_Clients.cl_id, CLOI_ClientOrderItems.cloi_current_status
    ) B
ON A.cl_id = B.cl_id 

暫無
暫無

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

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