SQL 쿼리 오류: "다중 부분 식별자를 바인딩할 수 없습니다."
문제 설명
SQL 쿼리를 실행하는 동안 "멀티파트 식별자 'a.maxa'를 바인딩할 수 없습니다."라는 오류가 발생했습니다. 쿼리를 별도의 하위 쿼리로 분할한 후에도 오류가 여전히 존재합니다.
다음은 잘못된 쿼리의 예입니다.
<code class="language-sql">SELECT DISTINCT a.maxa , b.mahuyen , a.tenxa , b.tenhuyen , ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa a , quanhuyen b LEFT OUTER JOIN ( SELECT maxa , COUNT(*) AS tong FROM khaosat WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011' GROUP BY maxa ) AS dkcd ON dkcd.maxa = a.maxa WHERE a.maxa <> '99' AND LEFT(a.maxa, 2) = b.mahuyen ORDER BY maxa;</code>
오류 원인
이 오류는 쿼리에서 명시적 조인과 암시적 조인을 잘못 혼합하여 발생합니다. JOIN 키워드로 표현되는 명시적 조인은 암시적 조인(쉼표와 WHERE 절을 사용하여 지정)보다 우선합니다.
주어진 쿼리에서 테이블 a와 b를 명시적으로 조인한 다음 LEFT OUTER JOIN 구문을 사용하여 해당 조인 결과에 암시적으로 dkcd를 적용합니다. 그러나 a가 dkcd 명시적 연결의 일부가 아니기 때문에 이로 인해 ON 절의 a.maxa에 대한 참조가 유효하지 않게 됩니다.
솔루션
이 문제를 해결하려면 일관된 조인 구문을 사용하도록 쿼리를 다시 작성하는 것이 좋습니다. 가능한 해결책은 다음과 같습니다.
<code class="language-sql">SELECT DISTINCT a.maxa, b.mahuyen, a.tenxa, b.tenhuyen, ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa a INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen LEFT OUTER JOIN ( SELECT maxa, COUNT(*) AS tong FROM khaosat WHERE CONVERT(datetime, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011' GROUP BY maxa ) AS dkcd ON dkcd.maxa = a.maxa WHERE a.maxa <> '99' ORDER BY a.maxa;</code>
이 수정된 쿼리에서는 명시적 조인이 명확하게 정의되었으며 a.maxa에 대한 참조는 ON 조건에서 유효합니다. Aaron Bertrand가 제안한 것처럼 잠재적인 모호함을 피하기 위해 ORDER BY 절에 별칭을 지정해야 합니다.
위 내용은 내 SQL 쿼리에서 '다중 부분 식별자를 바인딩할 수 없습니다.' 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!