左外连接不起作用

时间:2013-07-23 08:58:48

标签: sql oracle10g left-join

大家好,我在桌子下面 -

tr_resource as res -

Resourceid  name
135021          ABC

tr_charac为chlev -

characid   name
1          CH1
2          CH2

tr_characvalue as cvlev -

characvalueid characid stringvalue
cv1             1       XX
cv2             2       YY
cv3             2       zz

tr_resourcecharac为rchlev -

resourceid  characvalueid
135021          cv2

当我在查询下面运行时 -

select 
    res.name,
    cvlev.stringvalue
from tr_resource res
    left outer join tr_resourcecharac rchlev on res.RESOURCEID = rchlev.RESOURCEID
    inner join tr_characvalue cvlev on  rchlev.CHARACVALUEID = cvlev.CHARACVALUEID 
    inner join tr_charac chlev on chlev.CHARACID = cvlev.CHARACID and chlev.NAME = 'CH2'
 where res.resourceid=135021

我得到了答案 -

name  stringvalue
ABC      YY

但是当我在查询下面运行时,我没有得到任何答案 -

select 
    res.name,
     cvlev.stringvalue
 from tr_resource res
     left outer join tr_resourcecharac rchlev on res.RESOURCEID = rchlev.RESOURCEID
     inner join tr_characvalue cvlev on  rchlev.CHARACVALUEID = cvlev.CHARACVALUEID 
     inner join tr_charac chlev on chlev.CHARACID = cvlev.CHARACID and chlev.NAME = 'CH1'
 where res.resourceid=135021

我希望得到答案 -

name  stringvalue
ABC      null

你能帮忙吗?

2 个答案:

答案 0 :(得分:1)

您必须将所有内部联接更改为左外部联接。

答案 1 :(得分:0)

这并不能解释为什么您的第一个查询有效,但根据您显示的数据,我认为不会加入:

chlev.CHARACID = cvlev.CHARACID

应该工作,chlev是tr_charac的别名,表中的CHARACID是1和2,而cvlev是tr_characvalue的别名,CHARACID在这里是ch1,ch2& CH 2。

<强>更新

感谢您的澄清。我认为问题在于以下几行:

inner join tr_characvalue cvlev on  rchlev.CHARACVALUEID = cvlev.CHARACVALUEID

您正尝试在CHARACVALUEID上连接这两个表,但tr_resourcecharac中唯一的CHARACVALUEID是CV2,因此这只会在tr_characvalue中找到CV2行。 tr_characvalue在characid上连接到tr_charac,因此只能找到CH2行。当您的查询过滤到chlev.NAME ='CH1'时,不会返回结果。

关键是,你拥有的数据无法从tr_resource连接到tr_characvalue(即使使用其他具有外连接的表等),因为它们之间的唯一链接是tr_resourcecharac中的数据,该数据目前只有CV2的记录