【问题标题】:Oracle 11g merge Invalid Identifier with subquery in the INSERT VALUESOracle 11g 将 Invalid Identifier 与 INSERT VALUES 中的子查询合并
【发布时间】:2015-05-06 15:16:54
【问题描述】:

我正在尝试在过程中使用MERGE,并在插入值中使用USING_SET 进行查询

MERGE 如下所示:

MERGE INTO N_CUSTOMER dest
   USING S_customer src 
    ON (dest.CUSTOMER_ID = src.CUSTOMER_ID)
    WHEN
     MATCHED THEN
     update set
     dest.DATE_OF_BIRTH = src.S_BIRTHDATE,
     dest.GENDER = src.S_GENDER,
     dest.NAME = src.S_NAME
     WHEN NOT MATCHED THEN
     INSERT (DATE_OF_BIRTH, GENDER, NAME, TOTAL_FOO_COUNT)
     VALUES (src.S_BIRTHDATE, src.S_GENDER, src.S_NAME, 
            (select count(f.FOO_ID) from S_FOO f where f.CUSTOMER_ID = src.CUSTOMER_ID));

我得到的错误是:

无效的 SQL 错误:ORA-00904:“SRC”。“CUSTOMER_ID”:子查询中的标识符无效(从 S_FOO f 中选择 count(f.FOO_ID),其中 f.CUSTOMER_ID = src.CUSTOMER_ID)。

oracle 无法识别子查询中的“src”。有什么想法吗?

【问题讨论】:

    标签: sql oracle plsql oracle11g merge


    【解决方案1】:

    您可以使用outer variable

    declare 
    o_variable number;
    
    begin
    
    select count(f.FOO_ID) 
    into o_variable 
    from S_FOO f where f.CUSTOMER_ID in (select CUSTOMER_ID from S_customer.CUSTOMER_ID);
    
    MERGE INTO N_CUSTOMER dest
       USING S_customer src 
        ON (dest.CUSTOMER_ID = src.CUSTOMER_ID)
        WHEN
         MATCHED THEN
         update set
         dest.DATE_OF_BIRTH = src.S_BIRTHDATE,
         dest.GENDER = src.S_GENDER,
         dest.NAME = src.S_NAME
         WHEN NOT MATCHED THEN
         INSERT (DATE_OF_BIRTH, GENDER, NAME, TOTAL_FOO_COUNT)
         VALUES (src.S_BIRTHDATE, src.S_GENDER, src.S_NAME,o_variable);
    end;
    

    【讨论】:

      【解决方案2】:

      您可以在 src 本身中使用子查询,如下所示

      MERGE INTO N_CUSTOMER dest
         USING 
          (
          select cus.*,k.cnt
          S_customer cus join
          (select count(f.FOO_ID) cnt ,CUSTOMER_ID 
              from S_FOO f group by CUSTOMER_ID ) k
          on cus.CUSTOMER_ID = k.CUSTOMER_ID 
          ) src 
          ON (dest.CUSTOMER_ID = src.CUSTOMER_ID)
          WHEN
           MATCHED THEN
           update set
           dest.DATE_OF_BIRTH = src.S_BIRTHDATE,
           dest.GENDER = src.S_GENDER,
           dest.NAME = src.S_NAME
           WHEN NOT MATCHED THEN
           INSERT (DATE_OF_BIRTH, GENDER, NAME, TOTAL_FOO_COUNT)
           VALUES (src.S_BIRTHDATE, src.S_GENDER, src.S_NAME, src.cnt);
      

      【讨论】:

      • 是的,您是对的,但我正在尝试以最低的成本创建此合并。所以我试图避免 using_set 中的子查询。
      • 发布一些CREATE 脚本和INSERT 语句会很有用。
      猜你喜欢
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多