2016-04-28 7 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) 

Выбор КТР показывает правильно, что работа 2 должна быть обновлена ​​

SELECT * FROM cte 

Но обновление выдает ошибку: отсутствует FROM-п запись для таблицы "КТР"

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

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

Я никогда не использовал cte с обновлением, поэтому мне нужна помощь для понимания является.

ТИА,

ответ

10

Попробуйте UPDATE со следующим синтаксисом;

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

Отлично. Спасибо! – sibert

0

A 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 синтаксисом

Смежные вопросы