Oracle左外连接问题

Posted

技术标签:

【中文标题】Oracle左外连接问题【英文标题】:Oracle left outer join issue 【发布时间】:2015-08-18 21:04:20 【问题描述】:

我在使用左外连接的报告 SQL 中遇到问题。

 SELECT * FROM xx.aa 
           LEFT OUTER JOIN xx.yyy
           ON aa.some_column_1 = yyy.some_column_1
           AND aa.some_column_2 = yyy.some_column_2
           AND aa.some_column_3 = yyy.some_column_3
           AND yyy.some_year = '2015'
           AND yyy.some_column_4 IS NOT NULL
           AND yyy.some_column_4 > 0
 WHERE aa.some_column_1 = '1234' 
   AND aa.some_column_2 = 'SOME_VALUE'
   AND aa.end_date >= TO_DATE('01-JAN-2015','DD-MON-YYYY')
   AND aa.start_date <= TO_DATE('31-DEC-2015','DD-MON-YYYY')
   AND (aa.some_column_3 = 'SOME_VALUE')

表 aa

some_column_1 some_column_2 some_column_3 start_date end_date
1234          SOME_VALUE    SOME_VALUE    1/1/2011   6/30/2014
1234          SOME_VALUE    SOME_VALUE    7/1/2014   6/30/2015

表格年年

some_column_1 some_column_2 some_column_3 some_column_4 some_year
1234          SOME_VALUE    SOME_VALUE    444           2015

但是,左外连接中的最后两个条件 IS NOT NULL&gt; 0 仅应在匹配多于 1 行且至少有一行满足这两个条件时应用。否则会出问题。

有什么想法吗?

【问题讨论】:

样本数据和预期输出会有所帮助。 听起来你需要一个子查询和CASE。您应该发布整个 SQL 语句,因为我们看不到任何 aalocation。你可以设为a.f1, b.f1. c.f3等。我们不需要长名字 请查看更新谢谢! @user3224907 更新中的示例数据在哪里? 添加样本数据@FutbolFan 【参考方案1】:

您应该在没有左连接条件的情况下运行查询,然后对您的条件进行判断以确定 yyy 表中的值是否为空。

select aa_col1, aa_col2, ..., aa_coln,
    case when cnt > 2 and cond > 1 
              and not (yyy_some_column_4 IS NOT NULL AND yyy_some_column_4 > 0) 
         then null else yyy_col1 
         end as yyy_col1,
    ,...the other columns of yyy
from(
    SELECT aa.*, yyy.*,
      count(*) over() as cnt,
      count(case when yyy.some_column_4 IS NOT NULL AND yyy.some_column_4 > 0  then 1 end) over() as cond
    FROM xx.aa 
    LEFT OUTER JOIN xx.yyy
        ON aa.some_column_1 = yyy.some_column_1
               AND aa.some_column_2 = yyy.some_column_2
               AND aa.some_column_3 = yyy.some_column_3
               AND yyy.some_year = '2015'
     WHERE aa.some_column_1 = '1234' 
       AND aa.some_column_2 = 'SOME_VALUE'
       AND aa.end_date >= TO_DATE('01-JAN-2015','DD-MON-YYYY')
       AND aa.start_date <= TO_DATE('31-DEC-2015','DD-MON-YYYY')
       AND (aa.some_column_3 = 'SOME_VALUE')
)

在第 8 行,您应该为列设置别名,以便它们在上部选择中不同。我将它们命名为 aa_col1、yyy_col1 等。

【讨论】:

小问题,我无法从 aa 中选择。当我从 aa 中选择 aa_col1、aa_col2、... 或任何列时,表示列的定义不明确。如果我提供 aa.aa_col1,则表示标识符无效。 当我明确拼出列名而不是 SELECT aa.*, yyy.*, 时工作。谢谢你的帮助。我在同一份报告中遇到了问题,如果你碰巧有机会请看一下:link

以上是关于Oracle左外连接问题的主要内容,如果未能解决你的问题,请参考以下文章

oracle左外连接不显示右空值

添加 2 表条件时,Oracle 左外连接停止返回结果

Oracle 左外连接的一些測试

如何在 Oracle 中转换“旧版”左外连接语句?

Oracle SQL 查询(左外连接)

oracle 左外连接如果右表中有重复数据如何处理?