将一列从一个 table 复制到另一个

Copying a column from one table to another

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

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。

使用 insert 将行添加到 table,使用 update 更改现有行。这是一个示例,说明如何根据 link 将 photos 中的列更新为 c table:

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

使用 FROM 子句加入引用的 table 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.

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

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

  • How do I (or can I) SELECT DISTINCT on multiple columns?