【问题标题】:two left outer join not working Oracle sql两个左外连接不起作用Oracle sql
【发布时间】:2012-06-19 07:02:49
【问题描述】:

查询中有四个表
表 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

我想在 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

此查询正在工作,如果语言ID 存在于数据库中,如果特定值不存在,它将不起作用,即左外连接不起作用

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    看起来问题是,您没有使用(+) 进行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 )
    

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

    【讨论】:

    • 你能指出我可以了解多个连接的语法的文档吗?我不明白你为什么使用 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 )
    • 这里是JOINS documentation。不确定您所说的多个连接是什么意思。你是说这两个条件吗?外部连接成功所需的每个条件都放在此处。你是说我的两个LEFT JOINs 吗?您可以根据需要加入任意数量的表格。
    • 在您编写的查询中。我对执行连接的顺序有点困惑,因为没有括号。是否像最后一个连接将首先执行然后最上面的那个?
    • 最佳连接顺序由 Oracle 确定(也使用您的语法)。在这种情况下,我假设它首先连接ab,然后是两个外连接。恐怕我还是不明白你的担心,我的查询对你有用吗?
    【解决方案2】:

    如果你想要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 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      相关资源
      最近更新 更多