Sql server 更新查询在SQL Server中可以正常工作,但在Postgresql中不能

Sql server 更新查询在SQL Server中可以正常工作,但在Postgresql中不能,sql-server,postgresql,sql-update,Sql Server,Postgresql,Sql Update,我有一个ETL过程,它在SQL Server中似乎工作得很好,但我试图将其移植到Postgresql,却遇到了一些我不理解的问题 我在第一步创建了一个名为c_production的表。然后,我想基于与名为“上一年类型”的查找表的联接来更新c\u production.myValue的所有值。在SQL Server中,以下代码工作正常: update c_production set myValue = PTY.myValue FROM c_production CP JOIN pre

我有一个ETL过程,它在SQL Server中似乎工作得很好,但我试图将其移植到Postgresql,却遇到了一些我不理解的问题

我在第一步创建了一个名为
c_production
的表。然后,我想基于与名为“上一年类型”的查找表的联接来更新
c\u production.myValue的所有值。
在SQL Server中,以下代码工作正常:

update c_production 
    set myValue =  PTY.myValue
FROM c_production CP JOIN previous_type_year PTY
    on CP.StFips = PTY.STFIPS
    AND CP.comcode = PTY.comcode
    AND CP.Year = PTY.YEAR

但是,如果我尝试使用Postgresql,我会一遍又一遍地得到相同的值,用于
myValue
。我真的不知道它在干什么。有什么提示可以告诉我为什么这两个系统对这个查询的处理方式如此不同吗?

在PostgreSQL和SQL Server中,他们通过添加FROM子句为SQL标准添加了一个扩展,并选择以不同的方式实现它。因此,在将更新从一个供应商复制到另一个供应商时,需要小心

请参阅此链接中标题为“从多个来源更新”的部分。

在您的情况下,通过以下操作更新SQL for PostgreSQL以使其工作:

UPDATE c_production 
    set myValue =  PTY.myValue
FROM previous_type_year PTY
WHERE c_production.StFips  = PTY.STFIPS
  AND c_production.comcode = PTY.comcode
  AND c_production.Year    = PTY.YEAR;

在我个人看来,PostgreSQL在扩展方面做得比SQL Server更新更符合逻辑。

感谢您提供的良好参考和详细答案。我想是这样的,但我的google foo无法提取出一个好的答案。我认为您仍然可以为该表添加别名:从上一个_type_year PTY更新c_production CP set myValue=PTY.myValue,其中CP.StFips=PTY.StFips和CP.comcode=PTY.comcode以及CP.year=PTY.year;