2016-12-29 2 views
1

이 쿼리는 일부 행을 업데이트하고 RETURNING 절에 업데이트 된 행을 반환합니다. 그러나 내부 쿼리에 ORDER BY mycolumn을 지정 했더라도 RETURNING에 의해 반환 된 행은 정렬되지 않습니다.Postgres RETURNING 절과 조인 및 순서

UPDATE mytable SET status = 'A' 
FROM 
    (
    SELECT id FROM mytable 
    WHERE status = 'B' 
    ORDER BY mycolumn 
    LIMIT 100 
    FOR UPDATE 
) sub 
    JOIN jointable j ON j.id = sub.id 
WHERE mytable.id = sub.id 
RETURNING * 

은 내가 JOIN 후 또는 WHERE 후 같은 외부 쿼리에 ORDER BY을 퍼팅 시도,하지만 두 경우 모두에서 오류가 발생합니다. 원하는 순서로 행을 반환하도록하려면 어떻게해야합니까?

(A 비슷한 질문이 Update Returning Order by in postgresql에 대답했다하지만은 ORDER, 조인에 포함되지 않습니다.)

답변

3

사용 CTE :

WITH updated as(
    UPDATE mytable SET status = 'A' 
FROM 
    (
    SELECT id FROM mytable 
    WHERE status = 'B' 
    ORDER BY mycolumn 
    LIMIT 100 
    FOR UPDATE 
) sub 
    JOIN jointable j ON j.id = sub.id 
WHERE mytable.id = sub.id 
RETURNING * 
) 
select * 
from updated 
ORDER BY mycolumn 
+0

내가 얻을 오류 "mycolumn"BY'ORDER은 ambiguous'입니다 . 마지막 '주문'을 꺼내면 오류가 없습니다. 그래서 내부의'ORDER BY'는 괜찮습니다. 에러를내는 것은 바깥 쪽입니다. 조인의 두 테이블에 모두 'mycolumn'이 있기 때문입니다. 그럼 주문은 어떻게 작동합니까? – user779159

+0

RETURNING * 대신 필요한 열을 적어 두십시오. – cybernetic87

+1

예 : j.id, sub.mycolumn 반환, 특정 별칭을 사용해야 함을 기억하십시오 – cybernetic87