【问题标题】:Update with result from cte (postgresql)使用 cte (postgresql) 的结果更新
【发布时间】:2016-08-22 20:28:52
【问题描述】:

如果有任何记录是更早的日期,我想更新工作日期。尝试使用 CTE 来实现:

CREATE TABLE job
    (jobid int4, jobdate date);

INSERT INTO job
    (jobid, jobdate)
VALUES
    (1, '2016-02-01'),
    (2, '2016-02-01'),
    (3, '2016-02-01'),
    (4, '2016-02-01')
;

CREATE TABLE rec
    (recid int4, recjob int4, recdate date);

INSERT INTO rec
    (recid, recjob, recdate)
VALUES
    (1,1,'2016-02-01'),
    (2,2,'2016-01-01'),
    (3,3,'2016-02-01'),
    (4,4,'2016-02-01')
;

工作编号 2 的记录日期早于工作日期。所以我想用记录日期更新这个工作。

WITH      cte AS
          (SELECT jobid,least(min(recdate),jobdate)
FROM      job
LEFT JOIN rec ON recjob=jobid
GROUP BY  jobid,jobdate
HAVING    least(min(recdate),jobdate)<jobdate)

选择 cte 表明应该更新作业 2 是正确的

SELECT * FROM cte

但更新时出错:缺少表“cte”的 FROM 子句条目

UPDATE job 
SET    jobdate=cte.date 
WHERE  jobid IN (SELECT jobid FROM cte)

SQLFiddle:http://sqlfiddle.com/#!15/e9ae6/8

我从未将 cte 与 update 一起使用,因此我需要一些帮助来理解这一点。

TIA,

【问题讨论】:

    标签: sql postgresql postgresql-9.1


    【解决方案1】:

    使用以下语法尝试您的UPDATE

    UPDATE job
    SET jobdate = cte.date
    FROM cte
    WHERE job.jobid = cte.jobid
    

    【讨论】:

    • 优秀。谢谢!
    【解决方案2】:

    语法如下:

    WITH cte AS (
        SELECT * FROM ...
    )
    UPDATE table_to_update
    SET column_from_table_to_update = cte.some_column
    FROM cte
    WHERE table_to_update.id = cte.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 2014-10-10
      • 2012-11-28
      • 1970-01-01
      • 2023-03-18
      • 2023-01-26
      • 2019-02-13
      相关资源
      最近更新 更多