0

大家好,我有以下表格-

tr_resource 作为 res -

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

我想得到答案 -

name  stringvalue
ABC      null

能否请你帮忙?

4

2 回答 2

1

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

于 2013-07-23T09:13:12.957 回答
0

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

chlev.CHARACID = cvlev.CHARACID

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

更新

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

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 的记录。

于 2013-07-23T09:18:15.770 回答