PostgreSQL中使用左连接进行更新

6

如何编写一个查询来更新具有两个左联接的表。以下是MSSQL中的查询,我想将其转换为postgresql。 请帮忙。

在具有两个左连接的表中,编写更新查询的方法。以下是在MSSQL中的查询代码,需要将其转换为postgresql格式。请提供帮助。
Update T1 Set  
            T1.Amount = (T1.Amount - T2.Disc) + ((DT1.N_Amount)/2)

    From @Before T1
    Left Join @Before T2 On T1.ID = T2.ID
    Left Join @DiscTable DT1 On T1.PurchID = DT1.Purch_ID
1个回答

16

在PostgreSQL中也有这种可能性,主要区别在于

请注意,目标表不得出现在from_list中,除非您打算进行自连接(在这种情况下,必须在from_list中使用别名)。

您的查询转换为:

UPDATE "Before" "T1"
SET "T1"."Amount" = ("T1"."Amount" - "T2"."Disc") + (("DT1"."N_Amount")/2)
FROM "Before" "T2"
LEFT JOIN "DiscTable" "DT1" ON "T1"."PurchID" = "DT1"."Purch_ID"
WHERE "T1"."ID" = "T2"."ID"

但是为什么要在这里使用自连接呢?(如果"ID"是主键)我认为你可以更简单地实现你的目标,只需要:

UPDATE "Before" "T1"
SET "T1"."Amount" = ("T1"."Amount" - "T1"."Disc") + (("DT1"."N_Amount")/2)
FROM "DiscTable" "DT1"
WHERE "T1"."PurchID" = "DT1"."Purch_ID"

编辑: 关于引号的使用:

在 PostgreSQL 中,加引号和不加引号的标识符处理方式是不同的。添加引号后,标识符是区分大小写的,而未加引号的名称则总是折叠为小写字母。例如,PostgreSQL 认为标识符 FOO、foo 和 "foo" 是相同的,但 "Foo" 和 "FOO" 则与这三个标识符及彼此都不同。(在 PostgreSQL 中将未加引号的名称折叠为小写字母与 SQL 标准不兼容 。SQL 标准规定未加引号的名称应折叠为大写字母。因此,根据标准,foo 应等同于 "FOO" 而不是 "foo"。如果您想编写可移植的应用程序,则建议始终引用特定的名称或从不引用。)


4
但是它显示错误:对于表“t1”,引用无效。 - Akhilesh
1
如果您在表/列名称中混合使用大写和小写字母,请在所有地方或不使用引号。如果未引用postgresql标识符,则将其转换为小写字母以实现iso sql大小写不敏感性。http://www.postgresql.org/docs/9.3/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS - pozs
6
请注意,UPDATE FROM 和此处的 LEFT JOIN 版本的语义是不同的!UPDATE FROM 进行的是 INNER JOIN,因此如果 DiscTable 中没有相应的记录,则这些记录不会被更新。在 LEFT JOIN 版本中,这些记录会被更新为 NIL 值。 - GolDDranks

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