2012-06-13 2 views
0

중복 정렬을 사용하여 수천 개의 레코드가 있으므로 모든 레코드에 대해 올바른 정렬 순서를 설정하려고합니다.업데이트의 하위 쿼리에 아직 업데이트 된 레코드가 표시되지 않습니다.

먼저 나는 그들 모두를 설정 -1 그래서 SORTORDER는 0부터 시작 것, 그리고 내가이 쿼리를 실행합니다

UPDATE op.customeraddress SET sortorder = (SELECT MAX(ca.sortorder) + 1 
              FROM op.customeraddress AS ca 
              WHERE ca.customerid = customeraddress.customerid) 
WHERE id IN (<subquery for IDs>) 

문제는 하위 쿼리에서 MAX()는 항상를 반환하는 것이다 동일한 가치 - 이전 업데이트에 대해서는 알지 못합니다.

수동으로 레코드별로 레코드를 적용하면 쿼리가 제대로 작동합니다.

루핑에 의존하지 않고이를 수행하는 방법에 대한 아이디어가 있습니까?

당신은 순서를 사용할 수

답변

2

이 그것을 수행해야합니다

with new_order as 
(
    select ctid as rid, 
      row_number() over (partition by customerid order by sortorder) as rn 
    from customeraddress 
) 
update customeraddress ca 
    set sortorder = new_order.rn 
where ca.ctid = new_order.rid; 
    and ca.id IN (<subquery for IDs>); 

이를 실행하기 전에 SORTORDER를 재설정 할 필요, 그것은에 따라 하나 개의 CustomerID에 대한 모든 customeraddresses 번호를 다시합니다 오래된 명령.

당신은 위의 솔루션 PostgreSQL의 9.1이 필요합니다 (쓰기 열팽창 계수) 이전 버전

이 그것을해야 : 그 작동 거라고 생각하지 않습니다

update customeraddress ca 
    set ca.sortorder = t.sortorder 
from 
(
    select ctid as rid, 
      row_number() over (partition by customerid order by sortorder) as rn 
    from customeraddress 
) t 
where ca.ctid = t.rid 
    and ca.id IN (<subquery for IDs>); 
+0

9.1.2에서 실행 중이지만'using'에서 구문 오류가 발생합니다. 두 번째 쿼리는 몇 가지 열 이름 수정과 함께 작동하지만 1부터 계산되기 시작합니다 (하지만 쉽게 해결됩니다). 감사! –

+0

@elbekko : 죄송합니다. USING은 완전히 잘못되었습니다. –

0

가 :

CREATE TEMPORARY SEQUENCE sort_seq; 
UPDATE op.customeraddress SET sort_order = (
    SELECT nextval('sort_seq') 
    FROM op.customeraddress AS ca 
    WHERE ca.customerid = customeraddress.customerid 
) WHERE id IN ... 
+0

, 각 고객에 대한 SORTORDER로 내가 뭔가를 놓친 게 아니라면? –

+0

"각 고객의 정렬 순서는 0부터 시작해야합니다."... 나는 그 질문을 이해할 수 없습니다. 시퀀스를 만들면 0부터 시작합니다. 그리고이 시퀀스를 모두 0으로 설정할 수 있습니다. –

+0

테이블'customeraddress'에는 각 고객에 대한 여러 개의 주소가 들어 있습니다. 예를 들어 첫 번째 고객의 주소는 sortorder 0, 1이됩니다. 두 번째 고객의 주소는 sortorder 2, 3이됩니다. 모든 고객에 대해 시퀀스가 ​​재설정되는 위치가 누락되지 않은 경우가 아니면. –

관련 문제