用来自另一个表的数据更新列


11

我正在研究复杂的问题,但是我将简化为这个问题。

我有两张桌子

A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]

我想更新第三个:

C [ID, column1, column2,column3] 

我正在使用此查询更新另一个第三张表。

UPDATE C 
  set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab 
  from (select A.column1 as firstTab, B.column2 as secTab, 
              (A.column1 + B.column2) thirdTab 
        from A, B limit 1; ) as t ; 

我有:

UPDATE 0

当我运行此查询时:

select A.column1 as firstTab, B.column2 as secTab, (A.column1 + B.column2) thirdTab 
            from A, B limit 1; 

我得到了结果。我想念什么吗?

样本数据:http : //sqlfiddle.com/#!15/e4d08/5

Answers:


19

正确的格式应该是(假设缺少信息,请使用当前的pg版本9.3):

UPDATE C 
SET    column1 = A.column1 
     , column2 = B.column2 
     , column3 = A.column1 + B.column2
FROM   A
JOIN   B ON A.id = B.id  -- ??? not specified in question!
WHERE  C.id = A.id      --  ??? not specified in question!
AND   (C.column1, C.column2, C.column3) IS DISTINCT FROM
      (A.column1, B.column2, A.column1 + B.column2);

最后一个WHERE子句是可选的,可以避免不会更改任何内容的空更新(但仍要全额编写新的行版本)。

ypercube在评论中已经给出了基本解释:

您不会重复。您的派生表是交叉联接AB(即没有任何联接条件),然后选择任意行(LIMIT 1没有ORDER BY)。然后,它使用该任意行中的值来更新table的所有行C。如果要将不同的值用于C的不同行,则必须联接3个表(使用JOIN - ONWHERE

有关UPDATE详细信息,请参见手册。


0

您必须执行以下操作:

UPDATE C 
  set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab 
  from (select A.column1 as firstTab, B.column2 as secTab, 
              (A.column1 + B.column2) thirdTab 
        from A
        join B  on ...
        where ... ) as t
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.