/
Вопросы и ответы
/
SQL
/

Как использовать UPDATE с LEFT JOIN в PostgreSQL

Как использовать UPDATE с LEFT JOIN в PostgreSQL

В MySQL можно обновлять таблицу с использованием LEFT JOIN, например:

UPDATE users 
LEFT JOIN topics ON users.id = topics.user_id 
SET users.author = 'no' 
WHERE topics.id IS NULL;

Это работает для проставления 'no' всем пользователям, у которых нет топиков. В PostgreSQL такой синтаксис не поддерживается. Как корректно сделать аналогичное обновление в PostgreSQL, чтобы обновлять пользователей, которым нет соответствующих записей в другой таблице?

8 дней назад

Nikolai Gagarinov

Ответы

0

В PostgreSQL UPDATE с JOIN работает иначе. Синтаксис UPDATE ... JOIN ... SET ... не применяется. Вместо этого есть два подхода:

  1. Использовать подзапрос
UPDATE users
SET author = 'no'
WHERE id NOT IN (SELECT user_id FROM topics);
  • Здесь выбираются все пользователи, у которых нет записей в таблице topics.
  • Этот вариант эквивалентен LEFT JOIN ... WHERE ... IS NULL в MySQL.
  1. Использовать FROM для соединения таблиц
UPDATE users
SET author = 'yes'
FROM topics
WHERE users.id = topics.user_id;
  • Это работает как INNER JOIN — обновляются только пользователи, у которых есть соответствующие записи в topics.
  • Для реализации «LEFT JOIN» с обновлением пользователей без топиков можно комбинировать с условием:
UPDATE users
SET author = 'no'
FROM topics
WHERE users.id = topics.user_id IS NULL;
  • Более универсально для сложных запросов часто используют CTE (WITH), чтобы сформировать набор пользователей без топиков:
WITH no_topics AS (
  SELECT id FROM users
  LEFT JOIN topics ON users.id = topics.user_id
  WHERE topics.id IS NULL
)
UPDATE users
SET author = 'no'
WHERE id IN (SELECT id FROM no_topics);
  • Этот способ создаёт временную таблицу no_topics, с которой удобно работать и делать обновление.

Таким образом, PostgreSQL не поддерживает прямой UPDATE ... JOIN ..., но можно использовать подзапросы, FROM и CTE для аналогичного результата.

8 дней назад

Nikolai Gagarinov