【问题标题】:Copying a column from one table to another将一列从一个表复制到另一个
【发布时间】:2015-01-26 12:08:30
【问题描述】:

我有photos 表,我试图通过使用WHERE 子句过滤数据来从另一个表中插入一个新列。这是我要执行的查询:

ALTER TABLE photos ADD COLUMN new_count BIGINT;

INSERT INTO photos (new_count)
SELECT c.cnt
FROM c
WHERE  
    c.created = photos.created;

但结果我得到一个错误:

Error : ERROR:  invalid reference to FROM-clause entry for table "photos"
LINE 5:  c.created = photos.created

如何避免错误并复制列?
我正在使用 PostgreSQL 9.4。

【问题讨论】:

  • 使用更新,而不是插入。
  • 您的创建时间有多精细?是否可以在同一毫秒内创建多张照片?您要小心只更新正确的行。您没有要加入的 id 列?

标签: sql postgresql select sql-update


【解决方案1】:

使用FROM 子句加入引用表c

UPDATE photos p
SET    new_count = c.cnt
FROM   c
WHERE  c.created = p.created
AND    c.cnt IS NOT NULL;  -- optional, depends on additional circumstances

Details in the manual.

相关子查询(如demonstrated by @Andomar)通常速度较慢,而且它们还具有通常不受欢迎的副作用
如果在c 中没有找到匹配的行,则UPDATE 将继续进行,并将new_count 设置为NULL。在这种特殊情况下,这恰好是没有错(因为根据情况的定义,该列是 NULL)。这仍然是毫无意义的额外费用。不过,这种影响通常是有害的。

如果新值与旧值没有区别,则添加的条件AND c.cnt IS NOT NULL 进一步避免了空更新。如果 c.cnt 不能为 NULL,则无用。这是通用检查的简化形式:AND c.cnt IS DISTINCT FROM p.new_count。详情(最后一段):

【讨论】:

    【解决方案2】:

    使用insert 向表中添加行,使用update 更改现有行。下面是一个示例,说明如何根据c 表的链接更新photos 中的列:

    update photos p
    set    new_count = 
           (
           select  cnt
           from    c
           where   c.created = p.created
           )
    

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 2012-08-12
      • 2012-07-21
      • 2020-05-28
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多