2017-09-18 7 views
0

내가 두 테이블, 즉 고객 및 아래 제품이이 정의SQL 하위 선택 해상도

고객

  • customer_id있다.
  • customer_name.

제품

  • product_id.
  • product_name. 내가

    SELECT customer_id FROM customer WHERE customer_id IN (SELECT customer_id FROM product) 
    

    내 기대는 것이 었습니다 다음 쿼리를 실행하면

고객 테이블이

customer_id |customer_name 
---------------------------- 
1   | abc 
---------------------------- 
2   | efg 
------------------------------ 

제품 테이블 아래로 채워지는

product_id|product_name 
------------------------------ 
1   | chair 
----------------------------- 
2   | desk 
------------------------------ 

아래로 채워집니다 produ에 no customer_id 열 오류가 발생합니다. ct 테이블 대신이 쿼리는 고객 테이블의 모든 행을 반환합니다. 아무도 여기서 무슨 일이 일어 났는지 설명 할 수 있습니까? 하위 쿼리가 부모 쿼리의 테이블을 사용하여 불만없이 결과를 반환하는 이유는 무엇입니까?

답변

0

하위 쿼리의 customer_id은 정규화되지 않은 열이며 별칭 참조를 사용하지 않기 때문입니다. 이 경우 MySQL은이 열의 테이블 참조를 검색하므로 customer_id 열 (customer)에서 확인됩니다.

는 다음과 같이, 이러한 경우에 사용되어야한다

별칭 :이 경우

SELECT c.customer_id 
FROM customer AS c 
WHERE c.customer_id IN (SELECT p.customer_id FROM product as p) 

당신은 당신이 오류를 찾고 있습니다 얻을 것이다 : D는

+0

이 같은 쿼리가'고객에서 삭제한다는 뜻 where customer_id IN (SELECT customer_id FROM product)'이 고객 테이블에서 모든 레코드를 삭제합니까? 무섭다. – AceKing