在postgresql中使用左连接进行更新

时间:2014-04-02 12:25:43

标签: sql 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 个答案:

答案 0 :(得分:8)

这也可以在postgres the main difference is

中实现
  

请注意,目标表不得出现在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"

修改about quoting

  

引用标识符也会使其区分大小写,而不带引号的名称始终折叠为小写。例如,标识符FOO,foo和" foo" PostgreSQL被认为是相同的,但" Foo"和" FOO"不同于这三者和彼此。 (在PostgreSQL中将不带引号的名称折叠为小写字母与SQL标准不兼容,后者表示不带引号的名称应折叠成大写。因此,foo应该等同于" FOO" not" foo"根据标准。如果你想编写便携式应用程序,建议你总是引用一个特定的名称或从不引用它。)