간단한 쿼리가 있습니다.
SELECT u_name AS user_name FROM users WHERE user_name = "john";
나는 Unknown Column 'user_name' in where clause
. 'user_name'
이후에도 성명서의 다른 부분에서 언급 할 수 없습니까 select 'u_name as user_name'
?
답변
SQL은 오른쪽에서 왼쪽으로 거꾸로 평가됩니다. 따라서 where 절은 select 절 이전에 구문 분석되고 평가됩니다. 이 때문에 u_name에서 user_name으로의 별칭이 아직 발생하지 않았습니다.
답변
이건 어떤가요:
SELECT u_name AS user_name FROM users HAVING user_name = "john";
답변
다음 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은 알 수없는 별칭에서 지루하지 않아야합니다.
답변
귀하의 정의 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가 인라인보기로 푸시하는 술어를 지원하는 경우 전자와 동일해야합니다.