Oracle 为什么同一级别的别名不能在条件中使用

 我来答
龙氏风采
推荐于2018-04-12 · 知道合伙人互联网行家
龙氏风采
知道合伙人互联网行家
采纳数:5849 获赞数:12820
从事互联网运营推广,5年以上互联网运营推广经验,丰富的实战经

向TA提问 私信TA
展开全部
  当我们使用某个表达式作为输出的一列时,我们无法再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
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式