Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 优化联接查询_Sql_Left Join - Fatal编程技术网

Sql 优化联接查询

Sql 优化联接查询,sql,left-join,Sql,Left Join,我有以下疑问- select res.name, test.stringvalue from tr_resource res left outer join (select rch.resourceid,cv.stringvalue from tr_resourcecharac rch inner join tr_characvalue cv on rch.characvalueid = cv.characvalueid inner join tr_charac ch on cv.ch

我有以下疑问-

select res.name, test.stringvalue 
from tr_resource res 
left outer join 
(select rch.resourceid,cv.stringvalue from tr_resourcecharac rch 
inner join tr_characvalue cv on rch.characvalueid = cv.characvalueid 
inner join tr_charac ch on cv.characid = ch.characid and ch.name='Security Clearance Required')test
on res.resourceid=test.resourceid
where res.resourceid=135021
我得到以下输出为这个-

name stringvalue
ABC  null
我不想在左联接后使用子查询。您能告诉我是否有一种方法可以将此查询作为我在下面尝试编写的一系列连接来编写吗-

select res.name,cv.stringvalue 
from tr_resource res
left outer join tr_resourcecharac rch on res.resourceid=rch.resourceid
inner join tr_characvalue cv on rch.characvalueid =cv.characvalueid
inner join tr_charac ch on ch.characid=cv.characid and ch.name='Security Clearance Required'
where res.resourceid=135021
但是这个查询没有产生任何结果

有关表格方案,请参考-

tr_资源as-

Resourceid  name
135021       ABC
查拉克

characid   name
1          Security Clearance Required
2          CH2
tr_characvalue as-

characvalueid characid stringvalue
cv1             1       XX
cv2             2       YY
cv3             2       zz
tr_resourcecharac as-

resourceid  characvalueid
135021          cv2

我已经提出了这个问题,但没有人回答。因此,用更多信息重新发布这个问题

您可以在不使用派生表的情况下重写查询

SELECT res.name,
       cv.stringvalue
FROM   tr_resource res
       LEFT OUTER JOIN tr_resourcecharac rch
                       INNER JOIN tr_characvalue cv
                         ON rch.characvalueid = cv.characvalueid
                       INNER JOIN tr_charac ch
                         ON cv.characid = ch.characid
                            AND ch.name = 'Security Clearance Required'
         ON res.resourceid = test.resourceid
WHERE  res.resourceid = 135021 
但我怀疑这将是一种优化。这只是表达同一事物的另一种方式

或者另一种方式是

SELECT res.name,
       cv.stringvalue
FROM   tr_resourcecharac rch
       INNER JOIN tr_characvalue cv
         ON rch.characvalueid = cv.characvalueid
       INNER JOIN tr_charac ch
         ON cv.characid = ch.characid
            AND ch.name = 'Security Clearance Required'
       RIGHT OUTER JOIN tr_resource res
         ON res.resourceid = test.resourceid
WHERE  res.resourceid = 135021 

你在这里发同样的问题:!?是的,我试图删除它,但无法…已经向版主提出删除旧帖子。我在这里提供了更多的信息,谢谢martin…我从来都不知道我们可以像你写的那样,在左外连接的条件下写作…它起作用了perfectly@anidesh-同样,在这种情况下,由于所有其他联接都是内部联接,因此您可以将它们都放在第一个位置,然后将其右联接到最后的tr_资源上,作为替代方法。