为什么这个合并声明不起作用?

时间:2011-06-03 18:44:41

标签: sql oracle oracle10g ora-00904

我花了大部分时间试图确定为什么合并声明不起作用,我开始认为问题必须是有点异国情调。

我的数据库有许多使用合并语句的PL / SQL程序,但我绝对不能特别使用它。虽然它比显示的示例大得多,但我已将其删除,以便它只更新几列但仍然无法编译。

错误是'ORA-00904'别名“。”column_name“无效标识符”。这通常意味着列名称输入错误,或者在合并的情况下,您尝试更新在连接中使用的字段。这肯定不是这种情况。我已经进行了四重检查,列名是正确的,它们都存在,并且语句的格式与我在许多其他地方使用的格式完全相同。

    /** 
    Result: ORA-00904 "P"."SFDC_CUST_CONTACT_PK": invalid identifier

    I'm certain that the table and column names are all correct.

    If I join on any of the dozen or so other columns instead, I 
    get the exact same error.

    Note: I'm NOT attempting to update the column that I join
    against.


    **/

    merge into customer_contact c
    using (select p.fax_number,
           p.email
    from sfdc_cust_contact_temp p
    ) p
    on (p.sfdc_cust_contact_pk = c.sfdc_cust_contact_pk)
    when matched then
      update set 
      c.fax_number = p.fax_number,
      c.email = p.email;


    /*** 

    This works fine on the same machine 

    **/ 
    merge into customer_contact_legacy c
    using (select ct.contact_legacy_pk, 
          ct.fax_number,
          ct.email 
    from customer_contact_temp ct 
    ) ct
    on (upper(trim(ct.contact_legacy_pk)) = upper(trim(c.contact_legacy_pk)))
    when matched then
      update set 
      c.fax_number = ct.fax_number,
      c.email = ct.email;

任何想法在这里还有什么不对吗?桌上会出现某种腐败现象吗?

版本为10g。

1 个答案:

答案 0 :(得分:4)

您的using子句似乎缺少您尝试加入的列。

您的代码:

merge into customer_contact c
using (select p.fax_number,
       p.email
from sfdc_cust_contact_temp p
) p
on (p.sfdc_cust_contact_pk = c.sfdc_cust_contact_pk)

潜在的解决方法:

merge into customer_contact c
using (select p.sfdc_cust_contact_pk,
       p.fax_number,
       p.email
from sfdc_cust_contact_temp p
) p
on (p.sfdc_cust_contact_pk = c.sfdc_cust_contact_pk)