2011-04-01 29 views
3

我有一个似乎在SQL Server中运行良好的ETL过程,但我试图将它移植到Postgresql并运行到我不明白的东西中。更新查询按我期望的方式在SQL Server中运行,但不在Postgresql中

我在第一步创建了一个名为c_production的表。然后我想更新基于一个名为previous_type_year.在SQL Server中的查找表加入的c_production.myValue所有的值下面的代码工作正常:

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。我真的不知道它在做什么。任何提示,可以指出为什么这两个系统处理这个查询如此不同?

回答

3

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

请参阅此链接中标题为“从多个来源更新”的小节。 http://www.commandprompt.com/ppbook/x7050

http://sqlblog.com/blogs/hugo_kornelis/archive/2008/03/10/lets-deprecate-update-from.aspx

在你的情况下,更新SQL为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 UPDATE FROM的作品。

+0

感谢您的良好参考和详细的答案。我想这是这样的,但我的谷歌foo无法提取一个好的答案。 – 2011-04-01 20:06:50

+0

快速注意。我想,你仍然可以别名表:UPDATE c_production CP 集myvalue的= PTY.myValue FROM previous_type_year PTY WHERE CP.StFips = PTY.STFIPS AND CP.comcode = PTY.comcode AND CP.Year = PTY.YEAR ; – OleTraveler 2011-04-01 22:34:29

相关问题