복붙노트

[SQL] 열은 IN 절에 존재하지 않지만 SQL 실행

SQL

열은 IN 절에 존재하지 않지만 SQL 실행

나는 IN 절을 사용하는 쿼리가 있습니다. 여기에 단순화 된 버전입니다 :

SELECT *
  FROM table A
  JOIN table B
    ON A.ID = B.ID
 WHERE B.AnotherColumn IN (SELECT Column FROM tableC WHERE ID = 1)

테이블은 열 열이없는,하지만 쿼리는 오류 메시지없이 잘 실행. 아무도 그 이유를 설명 할 수 있습니까?

해결법

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

    1.외부 쿼리의 테이블이 그 이름의 열이있는 경우에 작동합니다. 외부 쿼리에서 열 이름이 하위 쿼리에 사용할 수 있기 때문입니다, 당신은 의도적 하위 쿼리 SELECT 목록에 외부 쿼리의 열을 선택하는 것을 의미 할 수있다.

    외부 쿼리의 테이블이 그 이름의 열이있는 경우에 작동합니다. 외부 쿼리에서 열 이름이 하위 쿼리에 사용할 수 있기 때문입니다, 당신은 의도적 하위 쿼리 SELECT 목록에 외부 쿼리의 열을 선택하는 것을 의미 할 수있다.

    예를 들면 :

    CREATE TABLE #test_main (colA integer) 
    CREATE TABLE #test_sub (colB integer)
    
    -- Works, because colA is available to the sub-query from the outer query. However,
    -- it's probably not what you intended to do:
    SELECT * FROM #test_main WHERE colA IN (SELECT colA FROM #test_sub)
    
    -- Doesn't work, because colC is nowhere in either query
    SELECT * FROM #test_main WHERE colA IN (SELECT colC FROM #test_sub)
    

    데미안가 관찰로, 가장 안전한 방법이 없음 너무나 명백 "잡았다"로부터 자신을 보호하기 위해 하위 쿼리에서 열 이름을 자격을하는 습관을 얻는 것입니다 :

    -- Doesn't work, because colA is not in table #test_sub, so at least you get
    -- notified that what you were trying to do doesn't make sense.
    SELECT * FROM #test_main WHERE colA IN (SELECT #test_sub.colA FROM #test_sub)
    
  2. ==============================

    2.당신이 (마 깁슨 설명 것을) 나중에이 상황을 방지하려면, 항상 열을 지정하는 별칭을 사용하는 습관을지고의 가치입니다. 예컨대 :

    당신이 (마 깁슨 설명 것을) 나중에이 상황을 방지하려면, 항상 열을 지정하는 별칭을 사용하는 습관을지고의 가치입니다. 예컨대 :

    SELECT *
      FROM table A
      JOIN table B
        ON A.ID = B.ID
     WHERE B.AnotherColumn IN (SELECT C.Column FROM tableC C WHERE C.ID = 1)
    

    이것은 (- tableC에 ID 열이 아니었다면, 당신은 또한 있었다 것 추가적인 문제 나 또한 절에서 별칭을 지정 주) 당신에게 좋은 오류 메시지를 준 것

  3. from https://stackoverflow.com/questions/5076906/column-does-not-exist-in-the-in-clause-but-sql-runs by cc-by-sa and MIT license