【问题标题】:Merging data from two tables into a third using Oracle MERGE INTO使用 Oracle MERGE INTO 将两个表中的数据合并到第三个表中
【发布时间】:2018-11-20 17:41:27
【问题描述】:

我是一名具有 MySQL 背景的 PHP 开发人员,第一次与 Oracle 合作。我正在尝试将两个表中的数据插入到第三个表中,其功能目标是跟踪用户访问我平台上某些产品的权限,同时避免 UNIQUE CONSTRAINT 错误(即添加重复记录)。我有三张桌子:

USERS
PERMISSIONS
USER_PERMISSIONS

我想做的是添加一行,其中包含来自 USERS 的 ID、来自 PERMISSIONS 的 ID 和当前用户的 ID(这样我们就知道是谁添加了记录)。这是我的尝试:

MERGE INTO USER_PERMISSIONS up 
    USING (
        SELECT 
            USERS.ID, 
            PERMISSIONS.ID 
        FROM 
            USERS, 
            PERMISSIONS 
        WHERE 
            PERMISSIONS.NAME = 'productalpha'
        AND 
            USERS.SHORTNAME = 'username'
    ) ON (
        USERS.ID = up.USER_ID 
        AND 
        PERMISSIONS.ID = up.PERMISSION_ID
    ) WHEN NOT MATCHED THEN 
    INSERT (
        USER_ID, 
        PERMISSION_ID, 
        LAST_UPDATED_BY_USER_ID
    ) VALUES (
        USERS.ID, 
        PERMISSIONS.ID, 
        '1'  
    );

但是,我遇到了 INVALID IDENTIFIER 错误。我知道查询的 USING (SELECT) 部分告诉查询我将使用哪些表,但我不确定如何正确识别它们以便查询工作。这是错误的方法吗?任何意见,将不胜感激。非常感谢!

编辑:我收到的确切错误消息是:

Error at Command Line : 16 Column : 9  
Error report -  
SQL Error: ORA-00904: "PERMISSIONS"."ID": invalid identifier  
00904. 00000 -  "%s: invalid identifier"  

【问题讨论】:

  • 发布完整的错误消息详细信息,并在此行发生

标签: oracle merge duplicates


【解决方案1】:

问题出在您的 ON 子句中。联接条件必须引用 USING 子句,但您正在引用基础表名称。解决方案很简单:给 USING 子句加上别名,并用别名标记 ON 子句。像这样::

MERGE INTO USER_PERMISSIONS up 
    USING (
        SELECT 
            USERS.ID as user_id, 
            PERMISSIONS.ID as permission_id
        FROM 
            USERS, 
            PERMISSIONS 
        WHERE 
            PERMISSIONS.NAME = 'productalpha'
        AND 
            USERS.SHORTNAME = 'username'
    ) q ON (
        q.user_id = up.USER_ID 
        AND 
        q.permission_id = up.PERMISSION_ID
    ) WHEN NOT MATCHED THEN 
    INSERT (
        USER_ID, 
        PERMISSION_ID, 
        LAST_UPDATED_BY_USER_ID
    ) VALUES (
        q.user_id, 
        q.permission_id, 
        '1'  
    );

请注意,您还需要为 USING 子句中的两个 ID 列设置别名,以避免 ORA-00918 列定义不明确的错误。

【讨论】:

  • 谢谢,非常清楚!为了将来查看此问题的其他人的利益,您介意更新您的答案以反映别名列名吗?完成后会接受!
  • 哎呀,我的错误 - 我正在查看 FROM 子句而不是 SELECT 子句。已接受,再次感谢!
【解决方案2】:

USING 子句中的查询是内联视图,因此别名 USERSPERMISSIONS 在它之外无效。试试这个:

MERGE INTO USER_PERMISSIONS up 
    USING (
        SELECT 
            USERS.ID, 
            PERMISSIONS.ID 
        FROM 
            USERS, 
            PERMISSIONS 
        WHERE 
            PERMISSIONS.NAME = 'productalpha'
        AND 
            USERS.SHORTNAME = 'username'
    ) source ON (
        source.ID = up.USER_ID 
        AND 
        source.ID = up.PERMISSION_ID
    ) WHEN NOT MATCHED THEN 
    INSERT (
        USER_ID, 
        PERMISSION_ID, 
        LAST_UPDATED_BY_USER_ID
    ) VALUES (
        source.ID, 
        source.ID, 
        '1'  
    );

【讨论】:

  • 很好的答案。如果 APC 没有击败您,这将是公认的答案:D 感谢您的反馈!
猜你喜欢
  • 1970-01-01
  • 2017-06-21
  • 2012-09-12
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 2018-03-23
相关资源
最近更新 更多