当子句没有数据时'with'子句与表联接'with'结果



我正在处理一个查询,该查询有一个带有子句(视图)的查询,并且它与使用INNER/OUT连接的表连接。问题是当表没有数据时,联接失败并且不返回任何结果。但是,视图包含数据。

我使用了在第一种情况下失败的 INNER 连接。然后我尝试使用左外连接,这也不起作用。实际上,主查询非常复杂,因此我在下面的代码片段中提出了问题。我只期待这种格式的答案

with myView as (Select mp.Id, sum(mp.Quantity) counts from Map mp where 
mp.bizDate='22-Jan-2019' group by mp.Id)
Select m.Id, mv.counts, (mv.counts - sum(m.Quantity)) from Map m 
LEFT OUTER JOIN myView mv ON 
m.id=mv.Id where m.bizDate='25-Jan-2019' group by m.Id, mv.counts

问题是当地图表没有记录时,它不会返回任何数据,即使 myView 有记录也是如此。无论如何,如果其中一个有数据(myView 或 Map),我需要记录。

示例数据:

表:地图

Id          Quantity               BizDate
A            100                   22-Jan-2019
A            300                   22-Jan-2019
A            300                   25-Jan-2019
B            100                   22-Jan-2019
B            200                   25-Jan-2019
C            500                   22-Jan-2019
D            300                   25-Jan-2019

预期输出应为:

Id        Counts               (counts-Quantity)
A         400                       100         --> (400-300)
B         100                      -100         --> (100-200)
C         500                       500         --> (500-NA)
D         0                        -300         --> (NA-300)

使用条件聚合计算每个愿望日期的数据。

SQL 演示

with myView as ( 
    Select mp.Id, 
           sum( CASE WHEN mp.bizDate='22-Jan-2019' 
                     THEN mp.Quantity
                     ELSE 0 
                END ) counts,
           sum( CASE WHEN mp.bizDate='25-Jan-2019' 
                     THEN mp.Quantity
                     ELSE 0 
                END ) quantity    
    from Map mp       
    group by mp.Id
)    
SELECT mv.Id, 
       counts,
       counts - quantity
FROM myView mv;

如果你想总是检索数据使用完全外部连接

with myView as (Select t.tuneId, t.name from Tune t where <someCondition>)
Select m.name, mv.name from Map m 
FULL OUTER JOIN myView mv ON 
m.id=mv.tuneID where <someCondition> 

您需要通过拆分条件来稍微更改代码的结构。

基本上,如果您担心MyView没有行,那么:

with myView as (
      Select t.tuneId, t.name
      from Tune t
      where <someCondition>
    )
select m.name, mv.name
from Map m left join
     myView mv 
     on m.id = mv.tuneID and
        <conditions on myView>
where <conditions not on myView> ;

如果map可能没有行,则角色颠倒:

with myView as (
      Select t.tuneId, t.name
      from Tune t
      where <someCondition>
    )
select m.name, mv.name
from myView mv left join
     Map m
     on m.id = mv.tuneID and
        <conditions on map>
where <conditions not on map> ;

最新更新