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

时间:2015-01-26 12:08:30

标签: sql postgresql select sql-update

我有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。

2 个答案:

答案 0 :(得分:2)

使用c子句加入引用的表FROM

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。细节(最后一段):

答案 1 :(得分:1)

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

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