2016-04-28 55 views
2

如果任何記錄是早期日期,我想更新作業日期。嘗試使用CTE實現此目的:更新爲cte(postgresql)的結果

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 

但更新給出了一個錯誤:缺少FROM子句爲表 「CTE」

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

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

我從來沒有用過更新的cte,所以我需要一些幫助來理解th是。

TIA,

回答

10

以下語法試試你UPDATE;

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

優秀。謝謝! – sibert

0

cte是表格。一個解決方案是做一個選擇它是這樣的:

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

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

或者使用UPDATE ... FROM語法