我正在处理一个查询,该查询有一个带有子句(视图)的查询,并且它与使用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> ;