SQL

2012-01-23 2 views
2

가능한 중복 : 그래서,SQL

select * from tablea where reference in (
select reference from tableb) 

가 열 reference는 TableB의에 존재하지 않습니다
sql server 2008 management studio not checking the syntax of my query
T-SQL Deletes all rows from a table when subquery is malformed

아래의 쿼리를 참조하십시오 나는 오류를 볼 것으로 예상했다. 이제는 테이블 a의 모든 행이 반환됩니다.


왜 tablea의 모든 행이 반환됩니까?

+5

SQL Server, Oracle, Sybase ASE, MySQL? –

+0

sql server. 감사. – w0051977

+0

'NOT IN'으로 리턴 된 행이 없어야합니다. [당신은 'IN'을 사용하지 않았습니까?] (http://stackoverflow.com/q/4594733/73226) –

답변

5

하위 쿼리 select reference from tableb 내부에는 상위 쿼리의 모든 열이 표시되므로 조건은 "where 1 = 1"과 같이 작동합니다.

"하나 이상의 테이블에서 선택하는 경우 모든 테이블에 별칭을 지정하십시오"라는 좋은 조언을하는 이유 중 하나입니다. 예를 들어, 귀하의 경우 :

select a.* from tablea a where a.reference in (
select b.reference from tableb b) 

이렇게하면 예상되는 컴파일 오류가 발생합니다.

+0

예, 쿼리를'select * from tablea로 변경하십시오. (select tableb.reference from tableb) ' –

+0

두 번째 쿼리는 다음과 같이 말합니다 : select reference from tableb. 그러나 참조는 tableb에 없습니다. 확실히 오류가 있어야합니까? 나는 분명히 뭔가를 놓친다. 감사. – w0051977

+0

Olivier, 귀하의 의견은 설명대로 작동합니다. 그러나 이것이 왜 "select tableb.reference from tableb"로 구문 오류를 발생시키지 않는가? 외부 쿼리를 추가하면 바로 내부 쿼리가 작동합니다. – w0051977