【问题标题】:Oracle outer joinsOracle 外连接
【发布时间】:2019-08-30 08:29:18
【问题描述】:

当我从表 a 运行时返回两条记录。

从 a.id = '123' 中选择 *

然后我创建了一个临时表 t6,注意:在这个临时表中没有返回 a.id 123 的记录。我使用 where 子句 a.id 123 对表 a 和 t6 进行了左连接,并期望返回 2 条记录,其中表 t6 中的值将为空或空白。但它没有返回任何行。我想知道如何修复以使其正常工作。

select a.*, t6.*
from 
(select t5.column1, t5.column2, t1.column3, t1.column9, t2.column9, t3.column9, t4.column9
from            (select column3, column8, column9 from t7
                where upper(column8) = upper('abcd')
                )  t1
                join (select column3, column8, column9 from t7               
                where upper(column8) = upper('efgh')
                ) t2
                on t2.column3 = t1.column3
                and t1.column3 in (select id2 from a where a.id = '123')
                left outer join
                (select column3, column8, column9 from t7
                where upper(column8) = upper('ijkl')
                ) t3
                on t3.column3 = t1.column3    
                left outer join
               (select column3, column8, column9 from t7
                where upper(column8) = upper('mnop')
                ) t4
                on t4.column3 = t1.column3
                join t5  
                on t1.column9 =  t5.column10
) t6
left join
a
on a.id2 = t6.column3
where a.id = '123'

【问题讨论】:

  • 如果您给我们测试数据和预期结果示例,希望有人可以帮助您。

标签: sql oracle outer-join


【解决方案1】:

表 A 应位于左侧,#t6 应位于右侧。

from a 
left join #t6 on on a.id2 = t6.column3

查询

select a.*, t6.*
from a
left join
(select t5.column1, t5.column2, t1.column3, t1.column9, t2.column9, t3.column9, t4.column9
from            (select column3, column8, column9 from t7
                where upper(column8) = upper('abcd')
                )  t1
                join (select column3, column8, column9 from t7               
                where upper(column8) = upper('efgh')
                ) t2
                on t2.column3 = t1.column3
                and t1.column3 in (select id2 from a where a.id = '123')
                left outer join
                (select column3, column8, column9 from t7
                where upper(column8) = upper('ijkl')
                ) t3
                on t3.column3 = t1.column3    
                left outer join
               (select column3, column8, column9 from t7
                where upper(column8) = upper('mnop')
                ) t4
                on t4.column3 = t1.column3
                join t5  
                on t1.column9 =  t5.column10
) t6

on a.id2 = t6.column3
where a.id = '123'

【讨论】:

    【解决方案2】:

    将您的 LEFT JOIN 更改为 RIGHT JOIN

    或者改变JOIN链的方向:

    SELECT a.*, t6.*
    FROM a LEFT JOIN ( SELECT ..... ) ON a.id2 = t6.column3
    WHERE a.id = '123'
    

    【讨论】:

      【解决方案3】:

      如果我理解主表是 a,那么你必须在第一个位置写表 a,如下所示:

      select a.*, t6.*
      from a left join
      (select t5.column1, t5.column2, t1.column3, t1.column9, t2.column9, t3.column9, t4.column9
      from            (select column3, column8, column9 from t7
                      where upper(column8) = upper('abcd')
                      )  t1
                      join (select column3, column8, column9 from t7               
                      where upper(column8) = upper('efgh')
                      ) t2
                      on t2.column3 = t1.column3
                      and t1.column3 in (select id2 from a where a.id = '123')
                      left outer join
                      (select column3, column8, column9 from t7
                      where upper(column8) = upper('ijkl')
                      ) t3
                      on t3.column3 = t1.column3    
                      left outer join
                     (select column3, column8, column9 from t7
                      where upper(column8) = upper('mnop')
                      ) t4
                      on t4.column3 = t1.column3
                      join t5  
                      on t1.column9 =  t5.column10
      ) t6
      on a.id2 = t6.column3
      where a.id = '123'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-02
        • 2017-02-22
        • 2018-05-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        相关资源
        最近更新 更多