2013-01-03 3 views
0

SELECT 쿼리를 사용하여 테이블 변수에서 일부 데이터를 삭제하려고합니다. 다음 코드는 완벽하게 작동합니다.두 삭제 쿼리 간의 차이

DECLARE @sgID int 
SET @sgID = 1234 

DELETE FROM 
    @tbl_users 
WHERE 
    (userID NOT IN (
      SELECT 
       userID 
      FROM 
       [SGTable] 
      WHERE 
       (sgID = @sgID) 
      )) 

나는이 쿼리의 속도를 높이려고하고 있으며 다음 방법이 더 좋을 수 있음을 읽습니다. 그러나 다음 코드를 사용할 때 - 모든 레코드가 테이블 변수에서 삭제됩니다.

DELETE 
    tmp 
FROM 
    @tbl_Users tmp INNER JOIN 
    [SGTable] sgu ON sgu.userID = tmp.userID 
WHERE 
    (sgu.sgID <> @sgID) 

나는 (분명히 잘못)이 두 쿼리가 같은 일 (사용자 아이디가 하위 쿼리에서 발견되지 않는 테이블 변수에 모든 사용자 아이디를 삭제)을 한 것으로 가정. 누구나 두 번째 쿼리 작업에 대한 조언을 제공 할 수 있습니까? 분명히 읽고 유지하기가 쉽습니다.

+8

당신이'와 DELETE'은''SELECT * 교체하고 결과가 설정 볼 수 있을까요? – Kermit

+0

예를 선택하면 테이블 변수에서 삭제해야하는 모든 사용자 ID가 표시됩니다. 나는 왜 delete 문이 다른 모든 행도 제거한다는 이유를 알지 못한다. : - \ – EvilDr

+0

userID가 둘 이상의 sgID와 연관 될 수 있기 때문에 그걸 알아 냈다. 멍청한 멍청한 나. 어쨌든 고마워 :-) – EvilDr

답변

1

SGTable에서 둘 이상의 sgID에 userID를 연결할 수 있습니까?

그렇다면 sgID (@sgID)의 사용자도 다른 sgID와 연결되어 있기 때문에 삭제하는 것입니다.

당신이 선호 할 수 있습니다

DELETE tmp 
FROM @tbl_Users tmp 
LEFT OUTER JOIN [SGTable] sgu ON sgu.userID = tmp.userID AND sgu.sgID = @sgID 
WHERE sgu.sgID IS NULL 
+0

나는 얼마나 어리 석다고 나는 믿을 수 없다. 예, 당신은 완전히 맞습니다. 질문의 이유는 테이블 변수를 검색하는 더 빠른 방법을 찾는 것이 었습니다. Wild in SQL의 Gail에 따르면 LEFT OUTER JOIN은 추가 필터링이 필요하기 때문에 IN보다 느립니다. 나는 내 원래의 계획에 집착해야 할지도 모릅니다. – EvilDr

+1

Gail이 옳다고 생각합니다. (나는 더 빠를뿐만 아니라 NOT IN을 찾았습니다). 단순한 유지 관리가 성능 차이 (테이블 크기에 따라 다를 수 있음)보다 더 중요하다고 생각한다면 대안을 제시하고있었습니다. 그리고 이와 같은 것을 알아 차리지 못하는 것은 어리석은 짓은 아닙니다. 다른 사람의 쿼리에서 문제를 찾는 것이 훨씬 쉽습니다. :-) – GilM

0

delete where exists 어때요?

DELETE FROM mytable 
WHERE EXISTS (
    SELECT * 
    FROM ....) 
; 
0

where 절이 "<>"이 아닌 "="가 아니어야합니까? 일치하는 레코드 (모든 레코드 일 수 있음)가 아닌 일치하는 레코드를 삭제하고 싶습니다. 맞습니까?