2013-07-23 200 views
0

您好所有我有如下表 -LEFT OUTER JOIN不工作

tr_resource作为资源 -

Resourceid name 
135021   ABC 

tr_charac作为chlev -

characid name 
1   CH1 
2   CH2 

tr_characvalue作为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 

我想获得回答r as -

name stringvalue 
ABC  null 

您能否帮忙?

回答

1

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

+0

嗨Raniendu感谢您的回复,但用左外连接代替内连接没有工作 – anidesh

0

这并不能解释为什么第一个查询工作,但根据你已经证明我不认为数据的连接:

chlev.CHARACID = cvlev.CHARACID 

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

UPDATE

感谢您的澄清。我认为问题是与线下:

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'no返回结果。

问题是,对于你所拥有的数据,你不能从tr_resource连接到tr_characvalue(甚至使用带有外连接的其他表),因为它们之间的唯一链接是tr_resourcecharac中的数据,它目前只有一条记录CV2。

+0

对不起克里斯是错字错误 – anidesh

+0

@anidesh我已经更新了上面的答案。恐怕你的表格不包含所有你想要创建的连接所需的数据。 – ChrisProsser