2013-04-01 7 views
1

거대한 저장 프로 시저가 있으며이를 최적화하려고합니다.표 A의 열을 기준으로 표 B의 열을 업데이트하십시오.

임시 테이블 Id이 있습니다.

이드 & 부울 필드 표 A의 모든 이드의 내용 시험

제가

예 표 B. 상기 테스트 = 1을해야 열이 메인 테이블 B가 : 나는 다음과 같은 테이블 B를 얻을 필요가

Id 
-- 
1 
2 
3 

. 이미 표 B의 id 필드가, 난 단지

Id Test 
-- ---- 
1 1 
2 1 
3 1 
4 
5 
6 

내가 현재 while 루프를 사용하여 표 통해 반복하고있는 테스트 열 B를 업데이트해야하고 각 ID I에 대한 표 B에있는 테스트 열을 업데이트하고 있습니다.

WHILE (1 = 1) 
BEGIN 

    -- Exit loop if no more Transactions 
    IF @@ROWCOUNT = 0 BREAK; 

    Update [B] 
    set Test = 1 
    where Id = (SELECT TOP 1 Id 
    FROM #B 
    WHERE Id > @Id1 
    ORDER BY Id)  

END 

PS : @ Id1은 저장 프로 시저의 입력 매개 변수입니다.

다른 효율적인 방법은 생각할 수 없지만 내 쿼리가 실행되는 데 많은 시간이 걸립니다. 동일한 작업을 수행하는 더 좋은 방법이 있는지 알려 주시기 바랍니다.

답변

1

당신은 단지 해당 테이블 라이브 데모와

UPDATE B 
SET B.Test = 1 
FROM TableB B 
INNER JOIN TableA A 
    ON A.Id = B.ID 

Here is an sqlfiddle에 가입, 이에 대한 루프가 필요하지 않습니다.

2

이것은 매우 간단합니다.

UPDATE [B] 
    SET [TEST] = 1 
FROM [B] INNER JOIN [A] 
    ON [A].ID = [B].ID 
+0

솔루션을 제공해 주셔서 감사합니다. – CodeNinja

2

또 다른 대안 :

UPDATE b SET test = 1 
    FROM dbo.TableB AS b 
    WHERE EXISTS (SELECT 1 FROM dbo.TableA WHERE ID = b.ID); 
1

당신은 업데이트 할 레코드를 찾을 in를 사용할 수 있습니다

update x 
set Test = 1 
from b as x 
inner join #A as a on a.id = x.id 
+0

대체 솔루션을 가져 주셔서 감사합니다! – CodeNinja

1

:

update b 
set Test = 1 
where Id in (select Id from #A) 

또 다른 대안이 테이블을 조인하는 것입니다 만약 내가' 제대로 질문을 이해 해요, 당신이 할 필요가 TableA의와 TableB의이 교차하는 기본적으로 당신은 모든 곳에서 업데이트 방법을 찾고 A와 B

UPDATE TableB SET test = 1 
FROM TableB b 
INNER JOIN TableA a ON a.id = b.id 
WHERE b.ID > @Id1 

에 가입합니다.

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

+0

감사합니다. 해결책은 나를 위해 작동합니다! – CodeNinja

관련 문제