使用更新时修复“INNER”或其附近的语法错误?

时间:2015-01-12 12:57:19

标签: postgresql sql-update syntax-error inner-join

当我尝试使用内部更新时出现此错误:

ERROR:  syntax error at or near "INNER"
LINE 1: UPDATE sale_order AS so SET state='progress' INNER JOIN sale...
                                                     ^

语法是:

UPDATE sale_order AS so 
SET so.state='progress' 
INNER JOIN sale_order_invoice_rel AS soi ON so.id= soi.order_id 
INNER JOIN account_invoice AS ai ON soi.invoice_id=ai.id
WHERE so.state='done' AND ai.state !='paid';

表的架构是:

  • sale_order : id | state
  • sale_order_invoice_rel : id | order_id |invoice_id
  • account_invoice : id | state

2 个答案:

答案 0 :(得分:0)

postgres更新语法是:

  • 更新target_table
  • SET ...
  • FROM other_table
  • [可选JOIN ... ON ...]
  • WHERE ......

UPDATE sale_order AS so 
SET state = 'progress' 
FROM sale_order_invoice_rel AS soi ON so.id = soi.order_id -- <<-- this line
JOIN account_invoice AS ai ON soi.invoice_id = ai.id
WHERE so.state = 'done' AND ai.state <> 'paid' -- <<-- this line
  ;

已更新(已从SET so.state = ...移除相关名称 - &gt; SET state = ...)

UPDATE2(哎呀!)2015-02-12(将ON ...移到WHERE ...子句)

UPDATE sale_order AS so 
SET state = 'progress' 
FROM sale_order_invoice_rel AS soi
JOIN account_invoice AS ai ON soi.invoice_id = ai.id
WHERE so.id = soi.order_id -- <<-- this line
AND so.state = 'done' AND ai.state <> 'paid'
  ;

答案 1 :(得分:-1)

我在使用DELETE脚本时遇到了同样的问题,并且找到了一个对同一问题可能有用的解决方案。

您可以使用以下其他表在PostgreSQL中创建JOINS:

UPDATE 
    sale_order AS so 
USING
    sale_order_invoice_rel AS soi,
    account_invoice AS ai
SET so.state='progress'
WHERE so.state='done' AND ai.state !='paid'
    AND so.id= soi.order_id 
    AND soi.invoice_id=ai.id;

希望对您有帮助。