Обновление записей отсутствует в предложении - PullRequest
0 голосов
/ 04 декабря 2018

В этом запросе я получаю сообщение об ошибке

ERROR:  missing FROM-clause entry for table "inv"
LINE 1: update stock_picking set invoice_status = inv.date_invoice

Моя цель - задать для stock_picking posting_date значение inv.date_invoice, если оно удовлетворяет всем условиям, возможно ли это с помощью SQL?

update stock_picking set posting_date = inv.date_invoice
where id in 
(
SELECT DISTINCT sp.id
FROM stock_picking sp
                       INNER JOIN stock_move sm ON sp.id = sm.picking_id
                       INNER JOIN sale_order_line sol ON sm.sale_line_id = sol.id 
                       INNER JOIN sale_order so ON sol.order_id = so.id
                       INNER JOIN sale_order_invoice_rel so_inv_rel on so.id = so_inv_rel.order_id
                       INNER JOIN account_invoice inv on so_inv_rel.invoice_id = inv.id

    WHERE 

            sp.posting_date != inv.date_invoice
            and sm.posting_date != inv.date_invoice
            and sp.state = 'done'       
            and inv.state in ('open', 'paid')
            )

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Вам нужно UPDATE ... FROM, чтобы иметь возможность ссылаться на столбец внутри запроса в обновлении.Соедините их в предложении WHERE позже.

UPDATE stock_picking u SET posting_date = t.date_invoice
FROM (
  SELECT DISTINCT ON (sp.id) 
    sp.id, inv.date_invoice
  FROM stock_picking sp
  INNER JOIN stock_move sm ON sp.id = sm.picking_id
  INNER JOIN sale_order_line sol ON sm.sale_line_id = sol.id 
  INNER JOIN sale_order so ON sol.order_id = so.id
  INNER JOIN sale_order_invoice_rel so_inv_rel on so.id = so_inv_rel.order_id
  INNER JOIN account_invoice inv on so_inv_rel.invoice_id = inv.id
  WHERE 
    sp.posting_date != inv.date_invoice
    and sm.posting_date != inv.date_invoice
    and sp.state = 'done'       
    and inv.state in ('open', 'paid')
  ORDER BY sp.id, inv.date_invoice DESC
) t
WHERE u.id = t.id

Поскольку я не знаю вашу модель, я предположил, что соотношение между stock_picking и account_invoice может быть 1: N, таким образом используя DISTINCT ON вернет только один date_invoice для каждого id.Вы можете использовать агрегатную функцию GROUP BY + MAX/MIN для достижения того же результата.

Обратите внимание на использование псевдонимов таблиц t и u.

0 голосов
/ 04 декабря 2018

Вы получаете сообщение об ошибке, так как запрос на обновление пытается получить данные из таблицы inv, которая вообще не объединяется.

Вы также можете выполнять объединения по запросам на обновление.

update sp
set posting_date = inv.date_invoice
from stock_picking as sp
inner join account_invoice inv on ***whatever columns link the tables together***
where id in 
(
    SELECT DISTINCT sp.id
    FROM stock_picking sp
        INNER JOIN stock_move sm ON sp.id = sm.picking_id
        INNER JOIN sale_order_line sol ON sm.sale_line_id = sol.id 
        INNER JOIN sale_order so ON sol.order_id = so.id
        INNER JOIN sale_order_invoice_rel so_inv_rel on so.id = so_inv_rel.order_id
        INNER JOIN account_invoice inv on so_inv_rel.invoice_id = inv.id
    WHERE 
        sp.posting_date != inv.date_invoice
        and sm.posting_date != inv.date_invoice
        and sp.state = 'done'       
        and inv.state in ('open', 'paid')
)
0 голосов
/ 04 декабря 2018

Вы можете попробовать ниже

update stock_picking S set posting_date = A.date_invoice
from 
(
SELECT DISTINCT sp.id, inv.date_invoice
FROM stock_picking sp
                       INNER JOIN stock_move sm ON sp.id = sm.picking_id
                       INNER JOIN sale_order_line sol ON sm.sale_line_id = sol.id 
                       INNER JOIN sale_order so ON sol.order_id = so.id
                       INNER JOIN sale_order_invoice_rel so_inv_rel on so.id = so_inv_rel.order_id
                       INNER JOIN account_invoice inv on so_inv_rel.invoice_id = inv.id

    WHERE 

            sp.posting_date != inv.date_invoice
            and sm.posting_date != inv.date_invoice
            and sp.state = 'done'       
            and inv.state in ('open', 'paid')
            ) A where S.id=A.id 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...