postgresql根据存储在另一个表中的值更新表列

postgresql根据存储在另一个表中的值更新表列,postgresql,Postgresql,我有两张桌子。我想基于另一个名为shiptype\u emodnet的表的emodnet\u-code列emodnet\u-code>更新名为2018\u-01的表的emodnet\u-code>列值,并使用其他两列值的匹配:columnaishipTypefrom2018\u-01表和列aishipType来自shyptype\u emodnet表格。查询已成功返回,但0行受影响: 更新“2018\u 01” 设置emodnet\u代码=shiptype\u emodnet.emodnet\u

我有两张桌子。我想基于另一个名为
shiptype\u emodnet
的表的
emodnet\u-code
emodnet\u-code>更新名为
2018\u-01
的表的
emodnet\u-code>列值,并使用其他两列值的匹配:column
aishipType
from
2018\u-01
表和列
aishipType
来自
shyptype\u emodnet
表格。查询已成功返回,但0行受影响:

更新“2018\u 01”
设置emodnet\u代码=shiptype\u emodnet.emodnet\u类型
来自“shiptype_emodnet”
其中“2018_01.aishipType”=“shiptype_emodnet.aishipType”;
您可以试试:

UPDATE "2018_01" t
SET t.emodnet_code = (SELECT shiptype_emodnet.emodnet_type 
                    FROM shiptype_emodnet 
                    WHERE t.aisshiptype = shiptype_emodnet.aisshiptype
                    Limit 1);

您应该为更新每行添加
limit 1
您正在比较WHERE子句中的字符串常量,而不是列。所以你的where条款:

WHERE '2018_01.aisshiptype' = 'shiptype_emodnet.aisshiptype';
始终为false,因为字符串literal
'2018\u 01.aishipType'
与字符串literal
'shiptype\u emodnet.aishipType'
不同。因此,您的where条件基本上与:

where false

需要用双引号(
)引用。单引号(
)仅用于


对于使用SQL中非法的名称或使用双引号和大小写混合创建的名称的列或表,您只需要双引号。

您的问题是什么?相应的
选择返回什么?查询成功返回,但影响0行,这是不可能的。我的问题是:有一些代码中有错误?为什么不可能?如果
SELECT
返回0行,则没有与
WHERE
条件匹配的数据。请检查它。显然,这不是“不可能”,因为这显然发生在您身上;)@luighalco如果该答案解决了您的问题,请检查它,以便将您的问题标记为已解决。
UPDATE "2018_01"
  SET emodnet_code = shiptype_emodnet.emodnet_type
FROM "shiptype_emodnet" 
WHERE "2018_01".aisshiptype = shiptype_emodnet.aisshiptype;