3 回答
TA贡献1805条经验 获得超9个赞
发生此错误的原因是,按照以下顺序对SQL SELECT语句进行了逻辑 *处理:
FROM:选择一个表或多个已联接的表以及符合ON条件的所有行组合。
WHERE:评估条件,并删除不匹配的行。
GROUP BY:将行分组(每组合为一行)
HAVING:评估条件,并删除不匹配的行。
SELECT:评估列列表。
DISTINCT:删除重复的行(如果它是SELECT DISTINCT语句)
UNION,EXCEPT,INTERSECT:那个操作的动作是在子SELECT语句的行拍摄。例如,如果它是UNION,则在评估所有子SELECT语句之后,将收集所有行(除非是UNION ALL,否则将删除所有重复行)。因此,对于EXCEPT或INTERSECT情况。
ORDER BY:行是有序的。
因此,您不能使用in WHERE子句(尚未填充或计算的东西)。另请参见以下问题:oracle-sql-clause-evaluation-order
* 逻辑处理: 请注意,数据库引擎还可以为查询选择其他评估顺序(这就是它们通常要做的!)。唯一的限制是结果应与使用上述顺序相同。
解决方案是将查询括在另一个查询中:
SELECT *
FROM
( SELECT ename
, job
, CASE deptno
WHEN 10 THEN 'ACCOUNTS'
WHEN 20 THEN 'SALES'
ELSE 'UNKNOWN'
END AS department
FROM emp
) tmp
WHERE department = 'SALES' ;
或在WHERE条件下重复计算:
SELECT ename
, job
, CASE deptno
WHEN 10 THEN 'ACCOUNTS'
WHEN 20 THEN 'SALES'
ELSE 'UNKNOWN'
END AS department
FROM emp
WHERE
CASE deptno
WHEN 10 THEN 'ACCOUNTS'
WHEN 20 THEN 'SALES'
ELSE 'UNKNOWN'
END = 'SALES' ;
我想这是查询的简化版本,或者您可以使用:
SELECT ename
, job
, 'SALES' AS department
FROM emp
WHERE deptno = 20 ;
TA贡献1786条经验 获得超11个赞
您的表不包含“部门”列,因此您不能在where子句中引用它。请改用deptno。
SELECT ename
, job
, CASE deptno
WHEN 10
THEN 'ACCOUNTS'
WHEN 20
THEN 'SALES'
ELSE 'UNKNOWN'
END AS department
FROM emp /* !!! */ where deptno = 20;
TA贡献1877条经验 获得超1个赞
select emp_.*
from (SELECT ename
, job
, CASE deptno
WHEN 10
THEN 'ACCOUNTS'
WHEN 20
THEN 'SALES'
ELSE 'UNKNOWN'
END AS department
FROM emp /* !!! */ ) emp_ where emp_.department='UNKNOWN';
添加回答
举报