0

查询中有四个表
Table a contains a_id , a_name
Table a_tl contains a_tl_id , a_id , language_id , a_disp_name
Table b contains b_id , a_id , b_name
Table b_tl contains b_tl_id , b_id , language_id , b_disp_name

我想在 a 和 a_tl 上做一个左外连接,在 b 和 b_tl 上做一个左外连接,
在结果表上做一个内连接。我写了以下查询

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 存在于数据库中,如果对于特定值不存在,它将不起作用,即左外连接不起作用

4

2 回答 2

3

看起来问题是,您没有(+)用于language_id支票。
您的表是外连接的,当没有找到记录时也是如此,但是您检查了language_id,但是?是。NULLlanguage_id = 2language_idNULL

我也看不到您在哪里使用a_tlor的结果b_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 )

希望我的问题是正确的,请问它是否不起作用。

于 2012-06-19T07:23:50.927 回答
1

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

如果您只想将 a_tl 中的行与 a_tl.language_id = 2 进行左连接,则如下所示:

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 )
于 2012-06-19T07:26:59.893 回答