집 >데이터 베이스 >MySQL 튜토리얼 >MySQL WHERE 절에서 열 별칭을 사용할 수 없는 이유는 무엇입니까?
#1054 - Unknown column 'guaranteed_postcode' in 'IN/ALL/ANY subquery'
과 같은 MySQL 쿼리 오류가 발생했나요? 이는 일반적으로 guaranteed_postcode
절 내에서 열 별칭(예: 아래 예의 WHERE
)을 사용하려고 할 때 발생합니다.
문제가 있는 쿼리는 다음과 같습니다.
<code class="language-sql">SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`, SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode` FROM `users` LEFT OUTER JOIN `locations` ON `users`.`id` = `locations`.`user_id` WHERE `guaranteed_postcode` NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>
근본 원인은? MySQL의 WHERE
절은 별칭이 정의된 절 앞SELECT
을 처리합니다. 따라서 guaranteed_postcode
절 실행 중에는 별칭 WHERE
이 아직 인식되지 않습니다.
MySQL 문서에는 WHERE
절에 열 별칭이 허용되지 않는다고 명시되어 있습니다. 이는 쿼리 실행 순서에 따른 제한 사항입니다.
이 문제를 해결하려면 두 가지 주요 옵션이 있습니다.
SUBSTRING
절의 하위 쿼리 내에 직접 WHERE
함수를 포함합니다.<code class="language-sql">SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`, SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode` FROM `users` LEFT OUTER JOIN `locations` ON `users`.`id` = `locations`.`user_id` WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>
HAVING
을 사용하는 것은 일반적으로 이 시나리오에서 덜 효율적입니다. HAVING
은 기본 행 필터링이 아닌 집계 후 필터링을 위해 설계되었습니다. 쿼리를 재구성해야 합니다. 자세한 설명은 WHERE
과 HAVING
를 비교하는 다른 자료를 참고하세요.이 특별한 경우에는 중첩된 하위 쿼리(옵션 1)가 더 깔끔하고 효율적인 솔루션을 제공합니다. WHERE
절의 범위 내에서 별칭 계산을 적용하여 문제를 직접 해결합니다. 집계를 수행하지 않는 한 HAVING
을 사용하지 마세요.
위 내용은 MySQL WHERE 절에서 열 별칭을 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!