Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 组合左外连接和全外连接_Sql_Oracle_Join_Oracle11g_Outer Join - Fatal编程技术网

Sql 组合左外连接和全外连接

Sql 组合左外连接和全外连接,sql,oracle,join,oracle11g,outer-join,Sql,Oracle,Join,Oracle11g,Outer Join,我意识到这可能有一个简单的答案,但我找不到任何东西,搜索已经有几个小时没有找到任何东西了。基本上,情况是我有一个带有两个表的查询(不止两个表,但为此目的只有两个表)。我试着在一个条件下用一个左外连接,在另一个条件下用一个全外连接来连接这两个。有人知道我该如何做到这一点吗 Select ResourceID, Month, Cost, Available FROM TableA JOIN TableB ON TableA.ResourceID=TableB.ResourceID --I

我意识到这可能有一个简单的答案,但我找不到任何东西,搜索已经有几个小时没有找到任何东西了。基本上,情况是我有一个带有两个表的查询(不止两个表,但为此目的只有两个表)。我试着在一个条件下用一个左外连接,在另一个条件下用一个全外连接来连接这两个。有人知道我该如何做到这一点吗

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
下面是每个表的数据示例和预期结果

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中的资源和两个表中的月数,那么我将更多地使用
联合来实现这一点:

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;

您可以将结果构建为外部联接,然后过滤掉来自B但没有相应a条目的记录

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)对


您需要合并,因为如果WHERE子句的后半部分保留了一条来自B的记录,但a中没有匹配的ID MOUNT,那么a.ID和a.MOUNT将为空。

有没有办法在没有并集和和的情况下执行此操作?我有更多的列和额外的表需要与TableA连接,并且希望避免将它们连接到TableB的成本too@KevinMcGovern . . . 你的问题是关于两个表和四列。如果你还有其他问题,你应该把它作为一个问题而不是评论来提问。