Удалить с помощью подзапроса, который производит два столбца (в Postgresql) - PullRequest
1 голос
/ 17 мая 2019

Мне нужно удалить несколько записей, которые соответствуют двум столбцам, вычисленным с помощью подзапроса.

Я правильно вижу их с помощью этого запроса:

select * from user_assignments as ua, 
    (
        select user_assignments.user_id as uid, 
               job_selection as jid 
        from user_assignments
            join job_selections on job_id = jobs.id
            join data on job_selections.data_id = data.id
            where data.my_column IS NULL
    ) as sq
    where sq.uid = ua.user_id AND ua.job_selection_id = sq.jid;

Это работает, и я вижу7 назначений, которые я хочу удалить.

Однако удалить не так просто, как изменить SELECT на DELETE ...

Если я сделаю:

delete from user_assignments as ua, 
    (
        ...
    ) as sq
    where sq.uid = ua.user_id AND sq.jid = ua.job_selection_id;

Я получу:

ERROR:  syntax error at or near ","

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

По сути, у меня есть подзапрос, который правильно создает два столбца, которые я могу использовать для SELECT FROM user_assignments, и теперь я хочу DELETE FROM user_assignments записей, которые, как я знаю, я могу ВЫБРАТЬ.

ЛюбойПодсказки будут очень признательны.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Используйте in или exists:

delete from user_assignments ua
where exists (select 1
              from user_assignments ua2 join
                   job_selections js
                   on ua2.job_id = js.id join
                   data d
                   on js.data_id = d.id
              where d.my_column IS NULL and
                    ua.user_id = sq.uid and ua.job_selection_id = sq.jid
             );
0 голосов
/ 17 мая 2019

О, я понял (я думаю).

Благодарность этому уроку этому уроку и, в частности, разделу Удаление записей SQL с использованием подзапросов с псевдонимом .

Если кому-то еще интересно, я сделал следующее:

DELETE FROM user_assignments ua
WHERE EXISTS(
    SELECT user_assignments.user_id as uid,
           user_assignments.job_selection as jid
    FROM user_assignments
        join job_selections on job_id = jobs.id
        join data on job_selections.data_id = data.id
    WHERE data.my_column IS NULL
        AND ua.user_id = uid
        AND ua.job_selection = jid
)

Этот запрос также отлично работает с SELECT * FROM user_assignments

...