2012-06-19 201 views
0

有四个表查询
表A中包含A_ID,a_name
表a_tl包含a_tl_id,A_ID,LANGUAGE_ID,a_disp_name
表B中B_ID ,A_ID,b_name
表b_tl包含b_tl_id,B_ID,LANGUAGE_ID,b_disp_name两个左外连接不能正常工作的Oracle SQL

我想做一个左外上AA加盟ND a_tl,一个leftouter上B和b_tl
和一个内连接上所得到的表连接.I写以下查询

SELECT case a.a_disp_name 
       WHEN null THEN a.a_name 
       else   a.a_disp_name 
      end AS   a_name    , 
      case b.b_disp_name 
       WHEN null THEN b.b_name 
       else   b.b_disp_name 
      end AS   b_name    , 
      a_id         , 
      b_id         
FROM  a          , 
      a_tl         , 
      b          , 
      b_tl     
WHERE  a.a_id = a_tl.a_id (+) 
AND  b.b_id = b_tl.b_id (+) 
AND  a_tl.language_id = 2  
AND  b_tl.language_id = 2  
AND  a.a_id= b.b_id 

该查询工作LANGUAGE_ID的是存在于数据库中如果特定值它不存在它不会工作,即左外部联接不工作

回答

3

看起来像问题是,你没有使用(+)language_id检查。
您的表是外连接的,所以language_idNULL当没有找到记录时,但是您检查了language_id = 2,但是? language_idNULL

我也看不到你使用a_tlb_tl的结果,你猜这只是你的文章的问题,而不是你的原始查询?


但是,请使用显式连接而不是旧语法。一旦你习惯了它,阅读和理解起来会更容易。
您的查询也可以使用COALESCE受益(或NVL如果您喜欢):

SELECT COALESCE(a_tl.a_disp_name, a.a_name) AS a_name, 
     COALESCE(b_tl.b_disp_name, b.b_name) AS b_name, 
     a.a_id, 
     b.b_id 
FROM a 
JOIN b ON (b.b_id = a.a_id) 
LEFT JOIN a_tl ON (a_tl.a_id = a.a_id AND a_tl.language_id = 2) 
LEFT JOIN b_tl ON (b_tl.b_id = b.b_id AND b_tl.language_id = 2) 

希望我把你的问题的权利,请询问如果它不工作。

+0

感谢您的回答。 –

+0

您能否指点我可以了解多个连接的语法的文档。我无法理解您为什么使用a_tl和b_tl而不是a,b'LEFT JOIN a_tl ON(a_tl.a_id = a.a_id AND a_tl.language_id = 2) LEFT JOIN b_tl ON(b_tl.b_id = b.b_id AND b_tl.language_id = 2)' –

+0

这里是['JOINS'文档](http://docs.oracle.com/cd /B28359_01/server.111/b28286/queries006.htm)。不确定你的意思是*多个连接*。你是说这两个条件?外连接成功所需的每个条件都放在那里。你的意思是我的两个'LEFT JOIN's?您可以根据需要加入尽可能多的表格。 –

1

如果你想a_tl.language_id = 2你强制内部联接(a_tl.language_id永远不会为空)。

如果你想只剩下从a_tl.language_id = 2 a_tl行加入,那么这样写:

FROM  a 
      join b on (a.a_id= b.b_id) 
      left join a_tl on (a.a_id = a_tl.a_id and a_tl.language_id = 2) 
      left join b_tl on (b.b_id = b_tl.b_id and b_tl.language_id = 2) 
+0

感谢您的回答。 –