복붙노트

[SQL] 어떻게 업데이트하고 위해 MS의 SQL을 사용하여합니다

SQL

어떻게 업데이트하고 위해 MS의 SQL을 사용하여합니다

이상적으로는이 작업을 수행 할 수 :

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

영어로 : 나는 DB에서 상위 10 사용할 수 (상태 = 0) 메시지를 얻을 싶어 (상태 = 10)를 잠급니다. 우선 순위가 높은 메시지가 먼저 입수해야한다.

불행하게도 MS SQL 업데이트에서 ORDER BY 절을 허용하지 않습니다.

어쨌든 어떻게 이것을 회피하기 위해?

해결법

  1. ==============================

    1.당신은 당신이 먼저 서브 쿼리에있는 사람 업데이트 한 후 우선 순위에 따라 정렬 된 상위 10의 ID를 얻고 하위 쿼리를 수행 할 수 있습니다

    당신은 당신이 먼저 서브 쿼리에있는 사람 업데이트 한 후 우선 순위에 따라 정렬 된 상위 10의 ID를 얻고 하위 쿼리를 수행 할 수 있습니다

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

    2.

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

    3.나는 더 나은 방법으로이 제공하는 - 당신은 항상 신원 필드의 사치가 필요하지 않습니다 :

    나는 더 나은 방법으로이 제공하는 - 당신은 항상 신원 필드의 사치가 필요하지 않습니다 :

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

    등, 여러 테이블을 조인 ... - 당신이 원하는처럼 복잡 또한 하위 쿼리를 만들 수 있습니다

    왜 이런 일이 더 좋다? 이 메시지 테이블의 아이덴티티 필드의 존재 (또는 다른 독특한 열)에 의존하지 않습니다. 그 표는 전혀 고유 키가없는 경우에도, 모든 테이블에서 상위 N 행을 업데이트 할 수 있습니다.

  4. ==============================

    4.

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

    5.아래 의견에 명시된 바와 같이, 당신은 또한 SET의 ROWCOUNT 절을 사용하지만, 단지 SQL 서버 2014 세 이상 수 있습니다.

    아래 의견에 명시된 바와 같이, 당신은 또한 SET의 ROWCOUNT 절을 사용하지만, 단지 SQL 서버 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)
    
  6. from https://stackoverflow.com/questions/655010/how-to-update-and-order-by-using-ms-sql by cc-by-sa and MIT license