문제

이상적으로는 이것을하고 싶습니다 :

UPDATE TOP (10) messages SET status=10 WHERE status=0 ORDER BY priority DESC;

영어로 : DB에서 상위 10 개 (상태 = 0) 메시지를 가져 와서 잠그고 싶습니다 (상태 = 10). 우선 순위가 높은 메시지를 먼저해야합니다.

불행히도 MS SQL은 업데이트에서 절로 주문을 허용하지 않습니다.

어쨌든 이것을 우회하는 방법?

도움이 되었습니까?

해결책

우선 순위에 따라 주문한 상위 10의 ID를 먼저 얻은 다음 해당 하위 쿼리에있는 ID를 업데이트하는 하위 쿼리를 수행 할 수 있습니다.

UPDATE  messages 
SET status=10 
WHERE ID in (SELECT TOP (10) Id 
             FROM Table 
             WHERE status=0 
             ORDER BY priority DESC);

다른 팁

WITH    q AS
        (
        SELECT  TOP 10 *
        FROM    messages
        WHERE   status = 0
        ORDER BY
                priority DESC
        )
UPDATE  q
SET     status = 10

나는 이것을 더 나은 접근 방식으로 제공해야합니다 - 당신은 항상 정체성 분야의 사치를 가지고 있지는 않습니다.

UPDATE m
SET [status]=10
FROM (
  Select TOP (10) *
  FROM messages
  WHERE [status]=0
  ORDER BY [priority] DESC
) m

하위 쿼리를 원하는만큼 복잡하게 만들 수 있습니다. 여러 테이블에 가입하는 등 ...

이것이 왜 더 나은가? 그것은 신원 필드 (또는 다른 고유 한 열)의 존재에 의존하지 않습니다. messages 테이블. 해당 테이블에 고유 한 키가 전혀 없더라도 모든 테이블에서 상단 N 행을 업데이트하는 데 사용할 수 있습니다.

UPDATE messages SET 
 status=10 
WHERE ID in (SELECT TOP (10) Id FROM Table WHERE status=0 ORDER BY priority DESC);

아래 주석에 언급 된 바와 같이, SET RowCount 절단도 사용할 수 있지만 SQL Server 2014 이상에만 사용할 수 있습니다.

SET ROWCOUNT 10

UPDATE messages
SET status = 10 
WHERE status = 0 

SET ROWCOUNT 0

더 많은 정보: http://msdn.microsoft.com/en-us/library/ms188774.aspx

또는 임시 테이블로

DECLARE @t TABLE (id INT)
INSERT @t (id)
SELECT TOP 10 id
FROM messages
WHERE status = 0
ORDER BY priority DESC

UPDATE messages
SET status = 10
WHERE id IN (SELECT id FROM @t)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top