繁体   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