"모호한 열"오류는 열 식별자에 대한 참조가 있고 MySQL에 사양과 일치하는 두 가지 (또는 그 이상) 가능한 열이 있음을 의미합니다. 이 특정 경우에는 WHERE
절에있는 CategoryID
열에 대한 참조입니다. CategoryID
열 (cat
) 또는 CategoryID 열 (p
)을 의미하는지 여부는 "모호합니다".
"수정"은 테이블 별칭 인 cat.CategoryID
또는 p.CategoryID
으로 열 참조를 한정하는 것입니다.
일부 추가 참고 사항 :
이
그것은 ON
절에 IN (subquery)
조건이 매우 이상한. CategoryID
이 Category
테이블에서 고유하지 않을 경우이 쿼리는 예상보다 많은 행을 생성합니다.
이 같은 쿼리에 대한 일반적인 패턴이 유사 뭔가 될 것이다 :
SELECT cat.CategoryID AS CategoryID
, COUNT(p.ProductID) AS CountProducts
FROM Category cat
LEFT
JOIN Products p
ON p.CategoryID = cat.CategoryID
WHERE cat.ParrentCategoryID = '876'
ORDER BY cat.Name
일반적으로 FROM 절에 두 개 이상의 테이블에서 ON
절 참조 열에 조인 술어. (즉, SQL 요구 사항이 아니다. 그건 그냥 일반적인 패턴입니다.) 쿼리의 ON
절에 술어가 위 지정
그 cat
(카테고리)에서 CategoryID
열의 값 테이블 경기의 값 p
(제품) 테이블의 CategoryID
열
또한 열을 모호하지 않은 경우에도 테이블 이름이나 테이블 별칭으로 쿼리에서 참조하도록 설정하는 것이 가장 좋습니다. 예를 들어 ORDER BY
절에있는 Name
열입니다.
이의 하나의 큰 장점은 (미래의 어떤 시점에) Name
라는 이름의 열이 Products
테이블에 추가되는 경우, Name
에 규정되지 않은 참조하여 쿼리 (다음)는 "모호한 열을 던져 시작하는 것입니다 "그 참조에 대한 오류. 따라서 모든 열 이름을 한정하면 새 열이 기존 테이블에 추가 될 때 작업 쿼리가 "중단"되지 않습니다.
또 다른 큰 이점은 진술의 독자에게 있습니다. MySQL은 어떤 테이블이 Name
이라는 것을 알기 위해 매우 빠르게 사전을 검색 할 수 있습니다.하지만 어떤 테이블에 Name
이라는 컬럼이 있는지 "알지 못하는"SQL 문을 읽는 독자는 또한 테이블 정의를 살펴볼 필요가 있습니다 찾아내는 것. 그 이름이 자격이 있다면, 우리는 이미 그 칼럼이 있던 테이블을 "알 것"입니다.
CategoryID가 두 테이블에 있습니다. 식별자 열의 이름을 테이블 이름으로 지정하는 것은 좋지 않습니다. 단지 id가 업계 표준이므로 잘 작동합니다. – Bohemian
'ON' 절에서'IN (subquery)'술어를 사용하는 것은 매우 이상합니다. 일반적으로, 'ON' 절의 술어는 FROM 절의 테이블에서 열을 참조합니다. (원하는 결과 집합이 실제로 무엇인지 이해하는 데 어려움이 있습니다.) – spencer7593