PostgreSQL联表更新

7

我想要连接两个表格,并在第二个表格的指定值上更新第一个表格的值。我尝试使用其他解决方案均失败。

UPDATE customers
SET cutoffstop = cutoffstop + '432000'
FROM customers as c
JOIN bluemedia as b ON c.id = b.customerid
WHERE b.orderid = '217201807'

1
“手册引用”(https://www.postgresql.org/docs/current/static/sql-update.html)中的一句话:“请注意,目标表不得出现在from_list中,除非您打算进行自连接”,换句话说:在FROM子句中**不要**重复目标表。 - user330315
在FROM子句中不需要重复客户表:UPDATE customers c SET cutoffstop = cutoffstop + '432000' FROM bluemedia as b ON c.id = b.customerid WHERE b.orderid = '217201807' - wildplasser
1
如果 cutoffstop 是一个数值字段:SET cutoffstop = cutoffstop + 432000(您不能将字符串添加到数值字段) - wildplasser
3个回答

20

一般更新语法:

[ WITH [ RECURSIVE ] with_query [, ...] ]
UPDATE [ ONLY ] table [ [ AS ] alias ]
    SET { column = { expression | DEFAULT } |
          ( column [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]
    [ FROM from_list ]
    [ WHERE condition | WHERE CURRENT OF cursor_name ]
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

你问题的解决方案:

UPDATE customers AS c
SET cutoffstop = cutoffstop + 432000
FROM bluemedia as b
WHERE c.id = b.customerid
AND b.orderid = '217201807'

了解更多关于UPDATE语法的信息,请点击下面的链接:

https://www.postgresql.org/docs/current/static/sql-update.html


抱歉,我给客户分配了错误的别名。现在请重试。 - Nishant Gupta
它一直抛出一个错误:ERROR: 语法错误在或靠近“AS” 第1行:SELECT COUNT(*) AS total FROM (UPDATE customers AS c ^ - rafal1137
2
@rafal1137 在你的原始查询中没有COUNT(*) - wildplasser
@wildplasser,我的查询语句中有语法错误吗? - Nishant Gupta
我认为我找到了一个原因,为什么在使用phpPgAdmin gui插入查询时,它会包括count(*)。我选择了在结果页面中显示。 - rafal1137
显示剩余2条评论

0
请使用以下查询进行更新:
UPDATE customers
SET cutoffstop = cutoffstop + 432000
FROM bluemedia as b ON customers.id = b.customerid
WHERE b.orderid = '217201807'

错误:在“SET”附近有语法错误 第2行:SET cutoffstop = cutoffstop + '432000' ^ - rafal1137
请告诉我cutoffstop的数据类型。如果cutoffstop是数字或整数,则删除单引号....更新客户 将cutoffstop设置为cutoffstop + 432000 从bluemedia作为b ON customers.id = b.customerid WHERE b.orderid ='217201807' - Anand Singh
@rafal1137:你不能使用 + 来添加字符串。但如果这些是数字,你需要去掉数字周围无用的单引号。'432000' 是一个 varchar,432000 是一个整数。 - user330315

0
你可以使用 EXISTS
UPDATE customers c
SET c.cutoffstop = c.cutoffstop + '432000'
WHERE EXISTS (
        SELECT 1
        FROM bluemedia b
        WHERE c.id = b.customerid
            AND b.orderid = '217201807'
        );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接