복붙노트

[SQL] MySQL의 쿼리의 FROM 절에서 오류가 발생 WHERE에 열 별칭을 사용하여

SQL

MySQL의 쿼리의 FROM 절에서 오류가 발생 WHERE에 열 별칭을 사용하여

그러나 나는이 오류가있어 다음과 같이 내가 실행 해요 쿼리는 다음과 같습니다

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 #this is where the fake col is being used
(
 SELECT `postcode` FROM `postcodes` WHERE `region` IN
 (
  'australia'
 )
)

내 질문은 : 왜 같은 DB 쿼리의 where 절에 가짜 열을 사용할 수 없습니다입니까?

해결법

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

    1.당신은 GROUP BY, ORDER BY 또는 HAVING 절에 열 별칭을 사용할 수 있습니다.

    당신은 GROUP BY, ORDER BY 또는 HAVING 절에 열 별칭을 사용할 수 있습니다.

    MySQL의 문서에서 복사

    코멘트에 지적한 바와 같이, 일을 할 수있는 대신 사용. WHERE하지만 HAVING 대 이것 읽기를 제공해야합니다.

  2. ==============================

    2.빅터가 지적했듯이, 문제는 별명입니다. 이것은 WHERE X의 Y 절에 직접 표현을 넣어,하지만 피할 수 있습니다 :

    빅터가 지적했듯이, 문제는 별명입니다. 이것은 WHERE X의 Y 절에 직접 표현을 넣어,하지만 피할 수 있습니다 :

    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 #this is where the fake col is being used
    (
     SELECT `postcode` FROM `postcodes` WHERE `region` IN
     (
      'australia'
     )
    )
    

    그러나, 나는 서브 쿼리가 외부 쿼리의 모든 행에 대해 실행해야하기 때문에 이것은 매우 비효율적이다 같아요.

  3. ==============================

    3.표준 SQL (또는 MySQL은) WHERE 절 때문에에 열 별칭의 사용을 허용하지 않습니다

    표준 SQL (또는 MySQL은) WHERE 절 때문에에 열 별칭의 사용을 허용하지 않습니다

    (MySQL의 문서에서). 당신이 할 수있는 것은 변수의 값을 저장, WHERE 절에 열 값을 계산하고 필드 목록에서 사용할 수 있습니다. 예를 들어, 당신은이 작업을 수행 할 수 있습니다 :

    SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
    @postcode AS `guaranteed_postcode`
    FROM `users` LEFT OUTER JOIN `locations`
    ON `users`.`id` = `locations`.`user_id`
    WHERE (@postcode := SUBSTRING(`locations`.`raw`,-6,4)) NOT IN
    (
     SELECT `postcode` FROM `postcodes` WHERE `region` IN
     (
      'australia'
     )
    )
    

    이것은 복잡 늘어 나면 유지하기 위해 코드를 더 쉽게, 표현을 반복 피할 수 있습니다.

  4. ==============================

    4.어쩌면 내 대답은 너무 늦기 그러나 이것은 다른 사람을 도울 수 있습니다.

    어쩌면 내 대답은 너무 늦기 그러나 이것은 다른 사람을 도울 수 있습니다.

    당신은 다른 선택 문을 넣어서 거기에 where 절을 사용할 수 있습니다.

    SELECT * FROM (Select col1, col2,...) as t WHERE t.calcAlias > 0
    

    calcAlias ​​계산 된 별명 열이다.

  5. ==============================

    5.당신은 SELECT 필드와 별칭을 기준으로 필터 HAVING 절을 사용할 수 있습니다

    당신은 SELECT 필드와 별칭을 기준으로 필터 HAVING 절을 사용할 수 있습니다

  6. ==============================

    6.나는 MySQL은 5.5.24 다음과 같은 코드가 작동을 사용하고 있습니다 :

    나는 MySQL은 5.5.24 다음과 같은 코드가 작동을 사용하고 있습니다 :

    select * from (
    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`
    ) as a
    WHERE guaranteed_postcode NOT IN --this is where the fake col is being used
    (
     SELECT `postcode` FROM `postcodes` WHERE `region` IN
     (
      'australia'
     )
    )
    
  7. ==============================

    7.표준 SQL 절 A의 WHERE 컬럼 별칭에 대한 참조를 허용하지 않습니다. WHERE 절가 평가 될 때, 열 값은 아직 결정되지 않을 수 있기 때문에 이러한 제한이 부과된다. 예를 들어, 다음 쿼리는 불법입니다 :

    표준 SQL 절 A의 WHERE 컬럼 별칭에 대한 참조를 허용하지 않습니다. WHERE 절가 평가 될 때, 열 값은 아직 결정되지 않을 수 있기 때문에 이러한 제한이 부과된다. 예를 들어, 다음 쿼리는 불법입니다 :

    SELECT 번호, COUNT (*) AS CNT FROM tbl_name를 WHERE CNT> ID GROUP BY 0;

  8. ==============================

    8.당신은 어디 조건 SUBSTRING (locations.raw를, -6,4)를 사용할 수 있습니다

    당신은 어디 조건 SUBSTRING (locations.raw를, -6,4)를 사용할 수 있습니다

    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 #this is where the fake col is being used
    (
    SELECT `postcode` FROM `postcodes` WHERE `region` IN
    (
     'australia'
    )
    )
    
  9. from https://stackoverflow.com/questions/942571/using-column-alias-in-where-clause-of-mysql-query-produces-an-error by cc-by-sa and MIT license