
Oracle 为什么同一级别的别名不能在条件中使用
推荐于2018-04-12 · 知道合伙人互联网行家
关注

展开全部
当我们使用某个表达式作为输出的一列时,我们无法再Where条件中直接使用该列作判断条件.例如下面的SQL语句:
selectid,(c1+c2)assfromt1wheres>100SQL Server 报错:"列名 s 无效" 当然,写成selectid,(c1+c2)assfromt1where(c1+c2)>100
就没问题了.可是当表达式复杂时就很繁琐了. 有没有可以在Where中使用这样的列名的办法?或者有什么其他办法可以解决这类问题呢?解决方法:
SQL code复制代码
select t2.*
from (select id, (c1 + c2) as c from t1) t2
where c > 100--或者select t2.*
from (select id, c = c1+c2 from t1) t2
where c > 100
由于在Where语句不能直接使用列别名,因此我们需要将Sql语句给包装一下在Oracle中,在WHERE子句中引用列别名会出错,这是为什么呢?因为:SELECT 语句的执行顺序1. from语句2. where语句(结合条件)3. start with语句4. connect by语句5. where语句6. group by语句7. having语句8. model语句9. select语句10. union、minus、intersect等集合演算演算11. order by语句
sqlserver查询的执行顺序是:
(1)FROM JOIN ON
(2)WHERE
(3)GROUP BY
(4)HAVING
(5)SELECT DISTINCT TOP()
(6)ORDER BY
所以在where执行的时候,别名还不存在,而order by的时候已经存在
因为sql是在where后order by前加别名,即生成结果集后加别名,where是在生成结果集前的操作,order by是生成结果集后的操作,因为where要生成结果集,而order by是对结果集的操作。如果非要用别名,那么只能用派生表,即先生成别名再where
select * from
(
select 字段1 as A,字段2 as B.... from tablename
) aaa
where A=1
order by A
selectid,(c1+c2)assfromt1wheres>100SQL Server 报错:"列名 s 无效" 当然,写成selectid,(c1+c2)assfromt1where(c1+c2)>100
就没问题了.可是当表达式复杂时就很繁琐了. 有没有可以在Where中使用这样的列名的办法?或者有什么其他办法可以解决这类问题呢?解决方法:
SQL code复制代码
select t2.*
from (select id, (c1 + c2) as c from t1) t2
where c > 100--或者select t2.*
from (select id, c = c1+c2 from t1) t2
where c > 100
由于在Where语句不能直接使用列别名,因此我们需要将Sql语句给包装一下在Oracle中,在WHERE子句中引用列别名会出错,这是为什么呢?因为:SELECT 语句的执行顺序1. from语句2. where语句(结合条件)3. start with语句4. connect by语句5. where语句6. group by语句7. having语句8. model语句9. select语句10. union、minus、intersect等集合演算演算11. order by语句
sqlserver查询的执行顺序是:
(1)FROM JOIN ON
(2)WHERE
(3)GROUP BY
(4)HAVING
(5)SELECT DISTINCT TOP()
(6)ORDER BY
所以在where执行的时候,别名还不存在,而order by的时候已经存在
因为sql是在where后order by前加别名,即生成结果集后加别名,where是在生成结果集前的操作,order by是生成结果集后的操作,因为where要生成结果集,而order by是对结果集的操作。如果非要用别名,那么只能用派生表,即先生成别名再where
select * from
(
select 字段1 as A,字段2 as B.... from tablename
) aaa
where A=1
order by A
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询