2016-07-01 3 views
-1

코드는 대략 이런 느낌 같은 (TSQL)를 정렬되지 않습니다다음 CTE 선택 주문 및 업데이트를 수행 한 후, 업데이트 결과는

WITH cte AS 
(
SELECT TOP 4 id, due_date, check 
FROM table_a a 
INNER JOIN table_b b ON a.linkid = b.linkid 
WHERE 
    b.status = 1 
    AND due_date > GetDate() 
ORDER BY due_date, id 
) 
UPDATE cte 
SET check = 1 
OUTPUT 
INSERTED.id, 
INSERTED.due_date 

주 : 실제 데이터가 동일 DUE_DATE 있습니다.

예를 들어 cte 내에서만 SELECT 문을 실행하면 예 : 1, 2, 3, 4에 대한 결과를 얻을 수 있습니다. 그러나 UPDATE 문 다음에 업데이트 된 결과는 다음과 같습니다. 4, 1, 2, 3

왜 (주문 변경)이 발생합니까?

같은 1 개의 쿼리에서 결과를 1,2,3,4로 다시 정렬하거나 순서를 변경하는 방법은 무엇입니까?

+0

을하지만 데이터의 순서가 다른 의심하지만이 대 당신의 선택에 이르기까지 더 :이 코드는 가정 것을 순서대로 출력 값을 반환합니다 출력이 정렬되지 않았기 때문에 출력 절. –

+1

[Microsoft] (https://msdn.microsoft.com/en-us/library/ms177564.aspx)에 따라 주문은 OUTPUT 절이 보장되지 않으므로이 출력을 새 SELECT TOP 4 이드, due_date ... ' – Polux2

+0

@ AllanS.Hansen 미안 내 질문에 분명하지 않은 경우. 나는 cte select와 update 후에 같은 순서를 얻으려고했다. 업데이트가 완료되면 주문이 변경되지 않는다고 가정합니다. – kurakura88

답변

0

MSDN https://msdn.microsoft.com/pl-pl/library/ms177564(v=sql.110).aspx에서 당신은 읽을 수

순서있는 변화가 테이블과 행이 출력 테이블 또는 테이블에 삽입되는 순서에 를 적용한다는 보장은 없다 변수가 일치합니다.

Thats는 하나의 쿼리로만 문제를 해결할 수 없다는 것을 의미합니다. 그러나 당신은 여전히 ​​당신이 필요로하는 것을하기 위해 하나의 배치를 사용할 수 있습니다. 출력이 주문을 보장하지 않기 때문에 다른 테이블에 저장하고 업데이트 후 주문해야합니다. 난 당신이 실제로 달성 하려는지 알아내는 고투

declare @outputTable table(id int, due_date date); 

with cte as (
    select top 4 id, due_date, check 
    from table_a a 
    inner join table_b b on a.linkid = b.linkid 
    where b.status = 1 
    and due_date > GetDate() 
    order by due_date, id 
) 
update cte 
set check = 1 
output inserted.id, inserted.due_date 
into @outputTable; 

select * 
from @outputTable 
order by due_date, id; 
+0

감사합니다. 업데이트 이후에 주문서에 보증이 없음을 알지 못했습니다. 이 주문 (일괄 처리)은 주문을 그대로 유지하는 유일한 방법입니다. – kurakura88