簡體   English   中英

左外連接和完全外連接組合

[英]Combined Left Outer Join and Full Outer Join

我意識到這可能有一個簡單的答案,但是我幾個小時都無法提出任何建議,搜索也沒有找到任何答案。 基本上,情況是我有一個包含兩個表的查詢(不止於此,但為此僅兩個)。 我正在嘗試在一個條件下用左外部聯接在另一個條件下用完全外聯接將兩者聯接。 有誰對我如何實現這一目標有任何想法?

Select ResourceID, Month, Cost, Available
FROM TableA
  JOIN TableB
    ON TableA.ResourceID=TableB.ResourceID --I want only resources in Table A
      AND TableA.Month=TableB.Month --all months in TableA or TableB
                        --but still create a single line for that resource/month

這是每個表的數據樣本和預期結果

表A

ResourceID  Month   Cost
1           Jan     30
1           Mar     90
1           Jun     100
1           Aug     120
1           Sep     60
2           Feb     80
2           Apr     90
2           May     60
2           Jul     70
4           Jan     50
4           Feb     60

表B

ResourceID  Month   Available
1           Jan     120
1           Feb     160
1           Mar     140
1           Apr     150
1           May     130
2           Jan     150
2           Feb     100
2           Mar     150
2           Apr     120
2           May     125
3           Jan     170
3           Feb     140
3           Mar     180

結果

ResourceID  Month   Cost    Available
1           Jan     30      120
1           Feb             160
1           Mar     90      140
1           Apr             150
1           May             130
1           Jun     100 
1           Jul             120
1           Aug     120 
1           Sep     60  
2           Jan             150
2           Feb     80      100
2           Mar             150
2           Apr     90      120
2           May     60      125
2           Jul     70  
4           Jan     50  
4           Feb     60  

任何幫助是極大的贊賞!

如果您想要表A中的資源以及兩個表中的月份,那么我會使用並union來解決這個問題:

select ResourceId, Month, sum(Cost) as cost, sum(Available) as available
from ((select ResourceId, Month, Cost, NULL as Available
       from tableA
      ) union all
      (select ResourceId, Month, NULL as Cost, Available
       from tableB
       where exists (select 1 from tableA where tableA.resourceId = tableB.resourceId)
      )
     ) ab
group by ResourceId, Month
order by ResourceId, Month;

您可以將結果構建為外部聯接,然后過濾掉沒有相應A條目的B記錄

Select Coalesce(TableA.ResourceID, TableB.ResourceID) as ResourceID
     , Coalesce(TableA.Month,TableB.Month) as Month, Cost, Available
FROM TableA OUTER JOIN TableB
    ON TableA.ResourceID=TableB.ResourceID --I want only resources in Table A
        AND TableA.Month=TableB.Month --all months in TableA or TableB
        --but still create a single line for that resource/month
WHERE TableB.ResourceID IS NULL OR TableB.ResourceID IN (SELECT DISTINCT ResourceID FROM TableA)

因為如果它來自表A但表B中沒有匹配項,則TableB.ResourceID將為NULL,您將保留它。
如果它來自兩個(與RedID和Month匹配),則TableB.ResourceID將位於A中,而WHERE子句的后半部分將使其保留。
如果它來自B但在A中具有匹配的ResID,則WHERE子句的后半部分也將保留它,即使它在A中沒有對應的(ID,Month)對。

您需要COALESCE,因為如果WHERE子句的后半部分保留了來自B且記錄中沒有匹配ID的記錄,則A中的Month則為A.ID和A.Month。

暫無
暫無

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

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