【问题标题】:SQL UPDATE from other tables来自其他表的 SQL UPDATE
【发布时间】:2014-02-06 15:07:03
【问题描述】:

我正在处理复杂的问题,但我会将其简化为这个问题。

我有两张桌子

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 ; 

我得到:更新 0

当我运行这个查询时:

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

我得到了结果。

【问题讨论】:

  • 请提供样本数据和期望的结果。此外,修正描述(“我有两个表”后跟 三个 表和“我正在创建第三个表”后跟 update 而不是 create table 语句)。
  • 只是为了确认一下,您想仅使用投影 t 第一行的值更新 C 的所有行吗?
  • @StuartLC:是的,完全正确。这就是我想做的。

标签: sql postgresql


【解决方案1】:

根据 cmets,这将从投影的第一行(未指定顺序)更新 C 的所有行:

UPDATE C
  set column1=t.firstTab, column2=t.secTab, 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;

SqlFiddle here

如果您只想用投影的第一行更新 C 的一行,并且如果 C.ID 是主键:

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

但是,如果您在 C 上没有主键,那么您可以使用 CTID system column

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

Updated Fiddle here

【讨论】:

  • 我看不出您的查询与我的查询有什么不同。
  • 2 小事——去掉限制后的分号,投影的列名是secTab。小提琴奏效。也许您的实际查询比给出的示例涉及更多,并且没有说明问题?
  • 但是为什么我们会得到重复?
  • ?你只是想用投影的第一行更新C的第一行吗?通常你会在 A、B 和 C 之间有某种连接条件。
猜你喜欢
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多