WHERE NOT EXISTS не работает при попытке вставить независимый от условия условие из другой таблицы - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь вставить значения в таблицу на основе условия из другой таблицы. Не основано на игнорировании повторяющихся значений. Но я продолжаю получать синтаксическую ошибку. Не уверен, как поступить.

Чего я хочу добиться, так это разрешить добавление пользователя в группу только в том случае, если в независимой таблице этот пользователь не блокирует текущего пользователя:

INSERT INTO users_to_groups(user_id, group_id) 
VALUES (1,'A') 
WHERE NOT EXISTS (SELECT * FROM users_to_users WHERE user_id_a=2 AND user_id_b=1 AND user_blocked=1);

EDIT

Я пытаюсь вставить несколько строк одновременно

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Если вы хотите INSERT только одну строку, вы можете попробовать следующим образом:

INSERT INTO users_to_groups(user_id, group_id) 
SELECT 1,'A'
FROM dual
WHERE NOT EXISTS
    (SELECT * FROM users_to_users
     WHERE user_id_a=2 AND user_id_b=1 AND 
     user_blocked=1);

Если вы хотите INSERT реальный результат запроса, вы можете изменить оператор SELECT с помощью вашей логики

Например:

INSERT INTO users_to_groups(user_id, group_id) 
SELECT u.id,'A'
FROM users u
WHERE NOT EXISTS
    (SELECT * FROM users_to_users
     WHERE user_id_a=u.id AND user_id_b=1 AND 
     user_blocked=1);

Но вы не можете использовать INSERT INTO ... VALUES с условием WHERE, потому что у вас есть синтаксическая ошибка

0 голосов
/ 05 июля 2018

Вы можете сделать:

INSERT INTO users_to_groups(user_id, group_id) 
    SELECT x.user_id, x.group_id
    FROM (SELECT 1 as user_id, 'A' as group_id) x
    WHERE NOT EXISTS (SELECT 1
                      FROM users_to_users utu
                      WHERE utu.user_id_a = 2 AND
                            utu.user_id_b = 1 AND
                            utu.user_blocked = 1
                     );
...