MS SQL을 사용하여 업데이트 및 주문 방법
-
19-08-2019 - |
문제
이상적으로는 이것을하고 싶습니다 :
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)
제휴하지 않습니다 StackOverflow