복붙노트

[SQL] WHERE 절에 알 수없는 열

SQL

WHERE 절에 알 수없는 열

나는 간단한 쿼리를 가지고 :

SELECT u_name AS user_name FROM users WHERE user_name = "john";

나는 where 절에서 알 수없는 열 '_ 이름'을 얻는다. 난 안 후 '_ 이름으로 u_name'를 선택에도 문의 다른 부분에 '_ 이름'을 참조 할 수 있습니까?

해결법

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

    1.SQL은 오른쪽에서 왼쪽으로, 이전 버전을 평가한다. 절은 구문 분석과 select 절 이전에 평가되는 위치 그래서. 때문에 _ 이름에 u_name의 앨리어싱의 아직 발생하지 않았다.

    SQL은 오른쪽에서 왼쪽으로, 이전 버전을 평가한다. 절은 구문 분석과 select 절 이전에 평가되는 위치 그래서. 때문에 _ 이름에 u_name의 앨리어싱의 아직 발생하지 않았다.

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

    2.는 어때:

    는 어때:

    SELECT u_name AS user_name FROM users HAVING user_name = "john";
    
  3. ==============================

    3.http://dev.mysql.com/doc/refman/5.0/en/select.html 다음 MySQL의 매뉴얼 페이지를 참조하십시오

    http://dev.mysql.com/doc/refman/5.0/en/select.html 다음 MySQL의 매뉴얼 페이지를 참조하십시오

    (...)

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

    4.

    select u_name as user_name from users where u_name = "john";
    

    이런 식으로 생각, 당신의 절은 반환 할 행 (또는 조인 행)의 필요성을 결정하기 위해, 첫번째 평가 곳. 일단 절은 실행되는 곳은 select 절은 그것을 실행합니다.

    그것을 더 나은 방법을 말하자면,이 상상 :

    select distinct(u_name) as user_name from users where u_name = "john";
    

    당신은 두 번째없이 전반을 참조 할 수 없습니다. 어디 항상 다음 select 절, 먼저 평가됩니다.

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

    5.당신은 당신이 실제로 데이터베이스에 존재하지 않는 새 필드를 만들 SELECT 문을 사용했습니다 다음과 같은 쿼리 (적어도 하나 개의 첨부 파일이있는 모든 노드를 찾을 수)를 수행하고, 사용하려고 시도하는 경우 이 같은 문제로 실행하겠습니다 그 결과에 대한 별칭 :

    당신은 당신이 실제로 데이터베이스에 존재하지 않는 새 필드를 만들 SELECT 문을 사용했습니다 다음과 같은 쿼리 (적어도 하나 개의 첨부 파일이있는 모든 노드를 찾을 수)를 수행하고, 사용하려고 시도하는 경우 이 같은 문제로 실행하겠습니다 그 결과에 대한 별칭 :

    SELECT nodes.*, (SELECT (COUNT(*) FROM attachments 
    WHERE attachments.nodeid = nodes.id) AS attachmentcount 
    FROM nodes
    WHERE attachmentcount > 0;
    

    당신은 "WHERE 절에 알 수없는 열 'attachmentcount'"오류가 발생합니다.

    솔루션은 실제로 매우 간단합니다 - 그냥 별칭, 예를 생산하는 문 별칭을 대체 :

    SELECT nodes.*, (SELECT (COUNT(*) FROM attachments 
    WHERE attachments.nodeid = nodes.id) AS attachmentcount 
    FROM nodes 
    WHERE (SELECT (COUNT(*) FROM attachments WHERE attachments.nodeid = nodes.id) > 0;
    

    당신은 여전히 ​​별칭이 반환거야,하지만 지금은 SQL은 알 수없는 별명에서 주방장 안된다.

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

    6.정의 된 별칭이 WHERE 절에 의해 환영되지 않은이의 HAVING 절을 사용해야합니다

    정의 된 별칭이 WHERE 절에 의해 환영되지 않은이의 HAVING 절을 사용해야합니다

    SELECT u_name AS user_name FROM users HAVING user_name = "john";
    

    또는 당신은 직접 WHERE와 함께 원래의 열 이름을 사용할 수 있습니다

    SELECT u_name AS user_name FROM users WHERE u_name = "john";
    

    같은 당신은 하위 쿼리의 결과 또는이 WHERE가없는 HAVING 절에 의해 액세스됩니다 어떤 계산과 같은 사용자 정의 별칭에 결과를 가지고

    SELECT u_name AS user_name ,
    (SELECT last_name FROM users2 WHERE id=users.id) as user_last_name
    FROM users  WHERE u_name = "john" HAVING user_last_name ='smith'
    
  7. ==============================

    7.어느 한 쪽:

    어느 한 쪽:

    SELECT u_name AS user_name
    FROM   users
    WHERE  u_name = "john";
    

    또는:

    SELECT user_name
    from
    (
    SELECT u_name AS user_name
    FROM   users
    )
    WHERE  u_name = "john";
    

    후자는 지원이 인라인보기로 밀어 술어 RDBMS 경우 이전과 동일하게해야한다.

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

    8.수정 :

    수정 :

    SELECT u_name AS user_name FROM users WHERE u_name = 'john';
    
  9. ==============================

    9.아니 당신은 올바른 이름으로 선택해야합니다. 당신은 당신이 별명에서 선택한 테이블을 준 경우에 당신은 그 생각을 사용할 수 있습니다.

    아니 당신은 올바른 이름으로 선택해야합니다. 당신은 당신이 별명에서 선택한 테이블을 준 경우에 당신은 그 생각을 사용할 수 있습니다.

  10. ==============================

    10.아니 당신은 할 수 없습니다. USER_NAME 님이 반환 될 때까지 존재하지 않는 것입니다.

    아니 당신은 할 수 없습니다. USER_NAME 님이 반환 될 때까지 존재하지 않는 것입니다.

  11. ==============================

    11.절 라인 1 및 2에 의해 발생 및 라인 (3)에 의해 해결 WHERE 알 컬럼 :

    절 라인 1 및 2에 의해 발생 및 라인 (3)에 의해 해결 WHERE 알 컬럼 :

  12. ==============================

    12.그것이 도움이 될 수 있습니다.

    그것이 도움이 될 수 있습니다.

    당신은 할 수 있습니다

    SET @somevar := '';
    SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
    

    효과가있다.

    하지만 SURE 당신 DO도하지!

    그러나, 그것은 어떤 경우에 도움이 될 수있다

  13. ==============================

    13.당신이 당신의 쿼리에서 테이블을 별칭을 수 있지만 (즉, "사용자 U를 FROM u.username을 선택;"), 당신은 열 당신이있는 거 참조의 실제 이름을 사용합니다. 필드가 반환하는 방법을 AS에만 영향.

    당신이 당신의 쿼리에서 테이블을 별칭을 수 있지만 (즉, "사용자 U를 FROM u.username을 선택;"), 당신은 열 당신이있는 거 참조의 실제 이름을 사용합니다. 필드가 반환하는 방법을 AS에만 영향.

  14. ==============================

    14.

    SELECT user_name
    FROM
    (
    SELECT name AS user_name
    FROM   users
    ) AS test
    WHERE  user_name = "john"
    
  15. ==============================

    15.다만이 문제를 가지고 있었다.

    다만이 문제를 가지고 있었다.

    확인 데이터베이스에있는 개체의 이름에 공백이 없도록 해주십시오.

    예를 들면 대신 'USER_NAME'의 '_ 이름'

  16. ==============================

    16.IN 조건 또는 OR 조건이 쿼리 스파크 1.6.x 이상인 경우에 노력을 사용하여 작업을 다시 시도

    IN 조건 또는 OR 조건이 쿼리 스파크 1.6.x 이상인 경우에 노력을 사용하여 작업을 다시 시도

     SELECT  patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');
    

    또는

    SELECT  patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';
    
  17. ==============================

    17.나를 위해 문제의 근본 내가 WHERE 절에서 사용하기에 복사 숫자였다. 수는 적어도 MySQL의 워크 벤치를 들면, "보이지 않는"기호가 있었다. 나는 그것이 명확하게 눈에 보였다 크롬 콘솔에 수를 놓았다.

    나를 위해 문제의 근본 내가 WHERE 절에서 사용하기에 복사 숫자였다. 수는 적어도 MySQL의 워크 벤치를 들면, "보이지 않는"기호가 있었다. 나는 그것이 명확하게 눈에 보였다 크롬 콘솔에 수를 놓았다.

  18. ==============================

    18.나는이 유용한 발견, 같은 문제가 있었다.

    나는이 유용한 발견, 같은 문제가 있었다.

    mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
    

    작은 따옴표 ''에 $ 사용자를 넣어 기억합니다.

  19. from https://stackoverflow.com/questions/153598/unknown-column-in-where-clause by cc-by-sa and MIT license