Слияние данных из двух таблиц в третью с использованием Oracle MERGE INTO - PullRequest
0 голосов
/ 11 июня 2018

Я - разработчик PHP с опытом работы с MySQL и впервые работаю с Oracle.Я пытаюсь вставить данные из двух таблиц в третью, с функциональной целью отслеживания разрешений пользователей на доступ к определенным продуктам на моей платформе, избегая при этом ошибок УНИКАЛЬНОГО ОГРАНИЧЕНИЯ (например, добавление дублирующихся записей).У меня есть три таблицы:

USERS
PERMISSIONS
USER_PERMISSIONS

И что я хочу сделать, это добавить строку, содержащую идентификатор от ПОЛЬЗОВАТЕЛЕЙ, идентификатор от РАЗРЕШЕНИЯ и идентификатор текущего пользователя (чтобы мы знали, кто добавил запись).Вот моя попытка:

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"  

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Проблема в вашем предложении 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'  
    );

Обратите внимание, что вам также необходимо создать псевдоним двух столбцов ID внутри предложения USING, чтобы избежать неоднозначно определенной ошибки в столбце ORA-00918.

0 голосов
/ 11 июня 2018

Запрос в предложении 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'  
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...