Postgresql: Как присоединиться к таблице, на которую нет ссылки в предложении from? - PullRequest
0 голосов
/ 09 июля 2020

У меня есть база данных postgres, в которой я иногда запускаю следующий запрос:

UPDATE b_address ba
SET op_id = op.land_id
FROM openb op
WHERE ba.str = op.name
AND (ba.openb_id IS NULL OR ba.openb_id = '');

Это работает, но теперь я хочу сделать это только для записей в таблице b_address где source равно "E". Однако источник хранится в другой таблице под названием b_b, к которой я могу присоединиться на b_address следующим образом:

SELECT ba.id, bb.source
FROM b_address ba
JOIN b_b bb ON bb.id = ba.bb_id
WHERE bb.source = 'E';

Сейчас я изо всех сил пытаюсь добавить это соединение в запрос UPDATE, чтобы я обновлять только записи из b_address, которые имеют source = 'E'.

Я пробовал это:

UPDATE b_address ba
SET op_id = op.land_id
FROM openb op
JOIN b_b bb ON bb.id = ba.bb_id
WHERE bb.source = 'E'
AND ba.str = op.name
AND (ba.openb_id IS NULL OR ba.openb_id = '');

Но потом получаю следующее:

ERROR: invalid reference to FROM-clause entry for table "ba"
  Hint: There is an entry for table "ba", but it cannot be referenced from this part of the query.

Это имеет смысл, потому что таблица всегда присоединяется к таблице в предложении FROM. Я не уверен, как бы мне их совместить.

Есть какие-нибудь советы, как действовать дальше?

1 Ответ

0 голосов
/ 09 июля 2020

Хммм. . . Один из методов - это cross join:

UPDATE b_address ba
    SET op_id = op.land_id
    FROM openb op CROSS JOIN
         b_b bb 
    WHERE bb.id = ba.bb_id AND
          bb.source = 'E' AND
          ba.str = op.name AND
          (ba.openb_id IS NULL OR ba.openb_id = '');

Альтернативой является подзапрос:

UPDATE b_address ba
    SET op_id = op.land_id
    FROM openb op
    WHERE ba.str = op.name AND
          (ba.openb_id IS NULL OR ba.openb_id = '') AND
          EXISTS (SELECT 1 FROM b_b bb WHERE bb.id = ba.bb_id AND bb.source = 'E');

Я действительно предпочитаю эту структуру первому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...