답변:
SQL은 오른쪽에서 왼쪽으로 거꾸로 평가됩니다. 따라서 where 절은 select 절 이전에 구문 분석되고 평가됩니다. 이 때문에 u_name에서 user_name으로의 별칭이 아직 발생하지 않았습니다.
이건 어떤가요:
SELECT u_name AS user_name FROM users HAVING user_name = "john";
HAVING
대신 사용 하는 이유는 무엇 WHERE
입니까?
다음 MySQL 매뉴얼 페이지를 참조하십시오. http://dev.mysql.com/doc/refman/5.0/en/select.html
"select_expr은 AS alias_name을 사용하여 별칭을 부여 할 수 있습니다. 별칭은 표현식의 열 이름으로 사용되며 GROUP BY, ORDER BY 또는 HAVING 절에서 사용할 수 있습니다."
(...)
WHERE 절이 실행될 때 열 값이 아직 결정되지 않았을 수 있으므로 WHERE 절에서 열 별칭을 참조하는 것은 허용되지 않습니다. B.5.4.4 절.“열 별칭 문제”를 참조하십시오.
select u_name as user_name from users where u_name = "john";
반환해야 할 행 (또는 조인 된 행)을 결정하기 위해 where 절이 먼저 평가됩니다. where 절이 실행되면 select 절이 실행됩니다.
더 나은 방법으로 말하면 다음과 같이 상상해보십시오.
select distinct(u_name) as user_name from users where u_name = "john";
두 번째없이 전반을 참조 할 수 없습니다. 항상 먼저 평가되는 곳은 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은 알 수없는 별칭에서 지루하지 않아야합니다.
(
전에 당신의 쿼리에 여분이 있다고 믿습니다 (COUNT(*)
.
귀하의 정의 alias
는 이에 대한 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";
하위 쿼리 또는 계산의 결과로 사용자 정의 별칭에 결과가있는 것과 동일 HAVING
합니다.WHERE
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'
어느 한 쪽:
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가 인라인보기로 푸시하는 술어를 지원하는 경우 전자와 동일해야합니다.
정확한 이름으로 선택할 필요가 없습니다. 별칭에서 선택한 테이블을 제공하면 사용할 수 있습니다.
WHERE
1 행과 2 행에 의해 발생하고 3 행에 의해 해결 된 절의 알 수없는 열
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
쿼리 내에서 테이블 별칭을 지정할 수 있지만 (예 : "SELECT u.username FROM users u;") 참조하는 열의 실제 이름을 사용해야합니다. AS는 필드가 반환되는 방식에만 영향을줍니다.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
이 문제가있었습니다.
데이터베이스의 엔티티 이름에 공백이 없는지 확인하십시오.
예 : 'user_name'대신 'user_name'
IN 조건 또는 OR 조건을 사용하여 작업을 시도 하고이 쿼리는 spark-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';