首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合左外连接和完全外连接

问组合左外连接和完全外连接
EN

Stack Overflow用户
提问于 2014-07-31 17:09:07
回答 2查看 87关注 0票数 0

我意识到这可能有一个简单的答案,但我什么也想不出来,搜索已经有几个小时没有发现任何东西了。基本上,情况是我有一个对两个表的查询(更多,但为此目的只有两个)。我试图在一个条件下用左外部连接连接,在另一个条件下加入一个完全的外部连接。有人知道我该怎么做吗?

代码语言:javascript
复制
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

以下是每个表的数据示例和预期结果

TableA

代码语言:javascript
复制
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

TableB

代码语言:javascript
复制
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

结果

代码语言:javascript
复制
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  

任何帮助都是非常感谢的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-31 17:49:09

您可以将结果构建为外部联接,然后在没有相应A项的情况下筛选出来自B的记录

代码语言:javascript
复制
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,月份)对。

您需要合并,因为如果WHERE子句的后半部分保留了来自B的记录,而没有匹配的ID,则A.ID和A.Month将为NULL。

票数 1
EN

Stack Overflow用户

发布于 2014-07-31 17:14:35

如果您希望表A中的资源和两个表中的月份,那么我将更多地使用union来处理这个问题。

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25065000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档