2016-04-28 178 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は、以前のジョブ日付よりも日付のレコードを持っています。だから私はこの仕事を記録日で更新したいと思う。

CTEを選択
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) 

ジョブ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を使用したことがないので、私は理解するためにいくつかの助けが必要ですです。

TIA、

答えて

10

次の構文を使用してUPDATEを試してみてください。

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

エクセレント... FROM UPDATEを使用します。一つの解決策は、このようにそれに選択を行うことです。ありがとうございました! – 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) 

や構文

関連する問題