proudmore
@proudmore
Добываю код из головы

Double join in update query?

Здравствуйте. Есть две таблицы - note, contractor.
В таблице note лежат два ключа на таблицу contractor (fk_contractor_from, fk_contractor_to);
Нужно произвести update note по условиям из contractor.
Как быть?

UPDATE 
    delivery_note 
SET 
    fk_contractor_from = fk_contractor_to,
    fk_contractor_to = fk_contractor_from 
WHERE 
    fk_contractor_from IN(
        SELECT DISTINCT id_contractor FROM contractor WHERE "type" = 'WH'
    )
    AND
    fk_contractor_to IN (
        SELECT DISTINCT id_contractor FROM contractor WHERE "type" = 'DC'
    )


Нужно уйти от вложенных запросов, что-то вроде такого, только работающее:
UPDATE 
    delivery_note as dn
SET 
    dn.fk_contractor_from = dn.fk_contractor_to,
    dn.fk_contractor_to = dn.fk_contractor_from
JOIN contractor as c_from ON dn.fk_contractor_from = c_from.id_contractor
JOIN contractor as c_to ON dn.fk_contractor_to = c_to.id_contractor
WHERE
    c_from.type = 'WH'
    AND
    c_to.type = 'DC'
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
proudmore
@proudmore Автор вопроса
Добываю код из головы
UPDATE 
    delivery_note as dn
SET 
    fk_contractor_from = fk_contractor_to,
    fk_contractor_to = fk_contractor_from
FROM contractor c_from, contractor c_to
WHERE
    (c_from.type = 'WH' AND dn.fk_contractor_from = c_from.id_contractor)
    AND
    (c_to.type = 'DC' AND dn.fk_contractor_to = c_to.id_contractor)
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Maksclub
@Maksclub
maksfedorov.ru
Нашел такой пример:
UPDATE applications a
SET documents_taken_at = b.certificate_issued_at         -- we can reference joined table here
FROM abiturients b                                       -- joined table
WHERE 
    a.abiturient_id = b.id AND                           -- JOIN ON clause
    a.documents_taken_at::date < b.certificate_issued_at -- Subquery WHERE
Ответ написан
BojackHorseman
@BojackHorseman
...в творческом отпуске...
вычислить id отдельными запросами и подставить в update не вариант?
Ответ написан
@d-stream
Готовые решения - не подаю, но...
По-моему в pg как и в ms синтаксис апдейта с джойнами выглядит так:

update tablex
set ....
from tablex
join ..
join ..
where ..
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы