2017-09-18 2 views
0

나는이 같은 T-SQL 쿼리가 있습니다.업데이트 위치를 선택, 보증 자성

편집 : 이 쿼리를 실행하면 [MyField]가 더 이상 NULL이 아니기 때문에 SELECT로 반환 된 ID를 다음 실행에 사용할 수 없습니다. 그러나이 쿼리를 동시에 두 번 실행하면 두 실행 모두 동일한 ID를 반환 할 수 있습니다 (두 번째 UPDATE는 첫 번째 UPDATE를 덮어 씁니다).

나는 이것을 피하기 위해 하나의 해결책은 SERIALIZABLE 격리 수준을 사용하는 것입니다. 그게 가장/가장 빠른/가장 간단한 방법인가요?

+0

당신이 무엇을 의미 보인다 (테스트 코드가 있음을 확인) ? 그것은 하나의 값만 반환해야합니다. 'WITH TIES' 옵션을 사용하지 않는 한. –

+0

'select는 동일한 Id를 두 번 반환 할 수 있습니다. ' 음, 항상 똑같은 이드를 돌려 줄거야. – sagi

+0

@sagi 업데이트가 실행되지 않습니다. – krimog

답변

2

범위를 좁힐이

SELECT DISTINCT TOP 1 name FROM [Class]; 

그것 그 중 하나 또는 같은 것을 사용할 수 있도록, UPDLOCK이 충분하다

0

먼저 최대 ID를 계산 한 다음 업데이트에 대한 교차 조인에 사용하십시오. SQL DEMO

WITH cte as (
    SELECT TOP 1 ID 
    FROM [MyTable] 
    WHERE MYFIELD IS NULL 
    ORDER BY ID 
) 
UPDATE t 
SET [ID] = cte.[ID] 
FROM [MyTable] t 
CROSS JOIN cte; 

OUTPUT

enter image description here

+0

수정 사항을 확인하십시오. 교차 결합 사용 –

+1

ID 열을 업데이트하려고한다고 생각하지 않습니다. –

+0

@DerrickMoeller 예, 쿼리를 마친 후에 실현됩니다. 그래서 샘플 데이터와 예상 출력을 요청합니다. 그러나 그 생각이 있습니다. –

0

이 상위 1 값을 초래하지만, 만약 그 같은 하나 개 이상의 값을 반환 할 수있는 잠재력을 가지고있다.

DISTINCT

본인은 최고를 사용해보십시오 (1) 단 1 개 행을 리턴하지만 문제는이 둘 이상의 행을 반환 주장한다. 그래서 나는 그 값이 같기 때문에 그것이있을 거라고 생각했습니다. 당신이 가능하게 절은 내가 볼 수 있듯이 결과

+0

TOP 1은 한 행만 반환합니다. –

+0

나는 그것이 맨 위 줄을 반환한다고 생각 했는가?그 행이 같으면 어떻게 될까요? –

+0

행이 같은 경우? 나는 당신의 요점을 이해하지 못한다. DISTINCT는 여러 값을 반환 할 것이다. 그것은 그의 의도처럼 보이지 않습니다. –