[英]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
視圖,因此別名USERS
和PERMISSIONS
在其外部無效。 嘗試這個:
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.