2012-09-06 4 views
2

SQL Server 2008 R2 (버전 10.50.4000.0) 사용 :이것은 SQL Parser 버그입니까? 아니면 내 오해?

두 개의 테이블이 있습니다. 한 테이블에서 ID가 다른 테이블에있는 데이터를 삭제하고 싶습니다. 충분히 간단합니다. 그러나 입력 실수로 인해 파서 버그 인 것으로 나타났습니다. 아래의 스크립트에서

는 [SomeID] 표 1의 열하지만 실제로는 표 2에 존재하지 않는

Delete from Table1 where [SomeID] in (Select [SomeID] from Table2) 

당신이 하위 쿼리 "Select [SomeID] from Table2를 실행하면 열이되지 않는다는 적절한 오류 메시지 있다. 당신이 비록 전체 삭제 쿼리를 실행하면

, 그것은 오류없이 실행하고, 표 1에서 모든

파서가 열이 나는 당신이 사용할 수있는 알고 표 2에 존재하지 않았다 잡은 것을 보인다 삭제 열 밖에서 하위 쿼리에서 파서는 내가 table1에서 열을 사용한다는 것을 전제로한다는 것을 알고 있었지만 table2의 열을 지정하지 않았기 때문에 파서는 제 의견으로는 충분히 똑똑해야했습니다. 뭔가 잘못되었다는 것을 알았습니다. 다행히도 이러한 일이 발생했을 때 우리는 테스트 환경에있었습니다. :)

덕분에, 토니

+0

나는 당신이 무엇을 발견했는지 확인할 수 있습니다. 파서는이 경우에 당신이 원하는 것을 파악할만큼 똑똑하지 않습니다. 외부 쿼리에서 테이블의 필드를 사용하려는 것으로 추측되었습니다. –

+7

BTW, 배워야 할 교훈은 테이블 이름이나 테이블 별칭으로 필드 이름을 항상 한정해야한다는 것입니다. –

+0

@Mikael Eriksson : 동의 함. –

답변

0

그것은 당신이 쿼리에 넣어 어떤 엔진이 할 것 오류 아니다.

당신이 In 절을 사용하는 경우, 예를 들어 In

의 결과, 각 행, 필드 SomeId에 대한 비교합니다, 당신은 그래서이

Delete from Table1 where [SomeID] in (Select [SomeID] from Table2 where IdTable2 = SomeId) 

을 할 수있는, 당신은 반환 할 수 상수로서 select에있는 어떤 것, table2의 Id, 두 경우의 합 또는이 경우 첫 번째 테이블의 ID.

이 경우 subquery를 실행할 때 where 절이 없으므로 하위 쿼리는 필터가 없기 때문에 항상 결과를 반환합니다 (행이없는 경우).하지만 표시되는 내용은 무엇입니까? 상위 쿼리에 필드를 지정하면이를 표시 할 수 있으므로 반환 할 수 있습니다. In과 비교하면 테이블 1에서 모두 삭제됩니다. 맞습니까?

+0

확실히 교훈을 얻었습니다. 참고로, 테스트 데이터베이스에서 테스트 가져 오기를 정리할 때 두 번째 테이블에 해당 레코드가있는 테이블의 모든 항목을 삭제하려고했습니다. 내가 예상했던 것보다 더 많은 것을 삭제하고 왜 오류가 없었는지에 대한 더 나은 이해를 찾고있었습니다. 내가 내 질문을 타이핑 할 때, 나는 알아 냈다. 그러나 확인을 필요로했다. 감사. –

관련 문제