복붙노트

[SQL] SQL 서버 2008 관리 스튜디오 내 쿼리의 구문을 확인하지

SQL

SQL 서버 2008 관리 스튜디오 내 쿼리의 구문을 확인하지

항상 그렇듯이,이 놀랍게도을위한 합리적인 설명 될 것이지만 그때까지 ....

나는이 쿼리를

delete from Photo  where hs_id  in (select hs_id  from HotelSupplier where id = 142)

잘 (나중에 내가 전체 사진 테이블이 비어있는 것을 발견)하는이 실행

하지만 이상한 것은 : HotelSupplier에는 필드 hs_id 없다, 그것은 hs_key라고!

내가 마지막 부분을 실행할 때 이렇게

select hs_id  from HotelSupplier where id = 142

별도 (마우스로 쿼리의 일부를 선택하고 F5를 명중), 오류가 발생합니다,하지만 난 절에 그것을 사용할 때, 그것은하지 않습니다!

이 정상적인 동작이 있을까?

해결법

  1. ==============================

    1.그것은 외부 쿼리에서 hs_id의 값을하고있다.

    그것은 외부 쿼리에서 hs_id의 값을하고있다.

    그것의 선택 목록에서 선택한 테이블의 모든 열을 투영하지 않는 쿼리를 완벽하게 유효합니다.

    예를 들면

    select 10 from HotelSupplier where id = 142
    

    where 절과 모든 행에 대한 값 10 일치로 여러 행으로하여 결과 세트를 반환합니다.

    규정되지 않은 열 참조는 상관 서브 쿼리로 처리됩니다,이 때문에 가장 가까운 범위 바깥에서 해결됩니다.

    hs_id 긴 HotelSupplier는 적어도 하나 개의 행이뿐만 null가 아닌 경우이 쿼리의 결과는 사진에서 모든 행을 삭제하는 것입니다 경우 ID = 142 (적어도 하나의 행 서브 쿼리 반환 정도)

    이 효과가 무엇인지 고려하는 경우는 조금 더 명확 수 있습니다

    delete from Photo  where Photo.hs_id  in (select Photo.hs_id)
    

    이에 코스 동등하다

    delete from Photo where Photo.hs_id = Photo.hs_id
    

    그런데이 멀리 떨어져 개인적으로 잘못 볼 연결 Microsoft에보고하는 가장 일반적인 "버그"입니다. ERLAND Sommarskog는 SET STRICT_CHECKS ON에 대한 자신의 위시리스트에 포함되어 있습니다

  2. ==============================

    2.이 테이블 간의 일관성있는 열 이름을 유지하는 강력한 인자이다. @Martin가 말한대로 내부 쿼리에 일치가 없을 때, SQL 구문은, 열 이름이 외부 쿼리에서 해결 될 수 있습니다. 이 상관 관계 서브 쿼리를 작성 보탬이지만, (여기로) 때때로 당신을 여행 할 수 있습니다

    이 테이블 간의 일관성있는 열 이름을 유지하는 강력한 인자이다. @Martin가 말한대로 내부 쿼리에 일치가 없을 때, SQL 구문은, 열 이름이 외부 쿼리에서 해결 될 수 있습니다. 이 상관 관계 서브 쿼리를 작성 보탬이지만, (여기로) 때때로 당신을 여행 할 수 있습니다

  3. from https://stackoverflow.com/questions/4594733/sql-server-2008-management-studio-not-checking-the-syntax-of-my-query by cc-by-sa and MIT license