我意识到这可能有一个简单的答案,但我什么也想不出来,搜索已经有几个小时没有发现任何东西了。基本上,情况是我有一个对两个表的查询(更多,但为此目的只有两个)。我试图在一个条件下用左外部连接连接,在另一个条件下加入一个完全的外部连接。有人知道我该怎么做吗?
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
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 60TableB
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 任何帮助都是非常感谢的!
发布于 2014-07-31 17:49:09
您可以将结果构建为外部联接,然后在没有相应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,月份)对。
您需要合并,因为如果WHERE子句的后半部分保留了来自B的记录,而没有匹配的ID,则A.ID和A.Month将为NULL。
发布于 2014-07-31 17:14:35
如果您希望表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;https://stackoverflow.com/questions/25065000
复制相似问题