簡體   English   中英

使用Oracle MERGE INTO將兩個表中的數據合並到第三個表中

[英]Merging data from two tables into a third using Oracle MERGE INTO

我是一名來自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"  

USING子句中的查詢是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'  
    );

問題出在您的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列含糊不清的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM