【问题标题】:a column may not be outer-joined to a subquery列不能外连接到子查询
【发布时间】:2016-06-04 07:51:57
【问题描述】:

在我使用oracle时出现此错误,但在mysql中可以正常工作

left outer join  
 daybreak.contract_details expiring     on
  expiring.acd_id  = 

  (select
 max(lastexpire.acd_id)  

from
 daybreak.contract_details lastexpire  

where lastexpire.acd_aad_id  =acc_aad_id and
  lastexpire.acd_itemization_tcd_code in ('IIN_5') and
  lastexpire.acd_expiry_dt between to_date('2014-01-01','yyyy-mm-dd') 
                               and to_date('2014-02-01','yyyy-mm-dd') and
  lastexpire.acd_term > 0

  )

谢谢

【问题讨论】:

  • 您遇到什么错误?另外,这个查询是否完整?

标签: mysql oracle


【解决方案1】:

你的问题到底是什么?

您不能在 Oracle 中外连接的连接条件中指定子查询。这样做会导致 ORA-1799 错误。

不过,几乎总是可以重写这样的查询。例如,您可以:

left outer join ( SELECT acd_aad_id, max(acd_id) max_acd_id FROM     daybreak.contract_details lastexpire   WHERE
  lastexpire.acd_itemization_tcd_code in ('IIN_5') and
  lastexpire.acd_expiry_dt between to_date('2014-01-01','yyyy-mm-dd') 
                               and to_date('2014-02-01','yyyy-mm-dd') and
 lastexpire.acd_term > 0 ) max_ids ON max_ids.acd_aad_id = aac_aad_id
left outer join  
daybreak.contract_details expiring     on
 expiring.acd_id  = max_ids.acd_aad_id

...这个想法是为内联视图中的每个可能值获取子查询的值,然后对其进行外部连接。

在 Oracle 12c 中,您可以使用 LATERAL 内联视图来获得该方法的更快执行变体。

另一种方法是只外连接daybreak.contract_details.acd_id 的所有值,而不仅仅是max() 值,然后过滤掉任何不是最大值的值,稍后on 在查询中(请记住,某些值可能为 null(即,如果在 contract_details 中根本没有匹配项)。

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 2016-12-17
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多