Oracle查询语句中重命名的列在WHERE中无效?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle查询语句中重命名的列在WHERE中无效?相关的知识,希望对你有一定的参考价值。
我想做的操作是这样的,有一张用户表和一张用户的属性表,我想在查询用户信息的时候得到该用户是否包含属性的个数,每种属性在属性表中为一行记录,所以我就直接在查询时COUNT 了,但是竟然报错了
下面的查询怎么会出错?
单独查询的时候已经可以显示结果了,为什么在条件语句中使用别名列无效?
好吧,我什么时候手贱按了个T上去。。。
FROM (SELECT id,
code,
name,
deptcode,
(SELECT COUNT (user_code)
FROM pars_cancompreson
WHERE user_code = code)
complain,
content,
createman,
createtime,
updateman,
updatetime,
delflag
FROM usermiddel)
WHERE complain = 1;
写成以上就可以,你如果不把里面括起来,oracle识别不到你的别名;这个语法还是很奇怪的,曾经我也被这个问题困扰过,估计要看oracle的处理步骤,当你使用
SELECT id,
code,
name,
deptcode,
(SELECT COUNT (user_code)
FROM pars_cancompreson
WHERE user_code = code)
complain,
content,
createman,
createtime,
updateman,
updatetime,
delflag
FROM usermiddel
where complain = 1
时,可能oracle先根据条件筛选,然后选择列,所以识别不到你的别名;你可以试试这样,不写子查询它也可以识别你的别名哦
SELECT id,
code,
name,
deptcode,
(SELECT COUNT (user_code)
FROM pars_cancompreson
WHERE user_code = code)
complain,
content,
createman,
createtime,
updateman,
updatetime,
delflag
FROM usermiddel
order by complain
像这个肯定是oracle查出数据以后排序,这样的时候就能识别你的别名了 参考技术A where,group后不能用别名。要
WHERE (SELECT COUNT(USER_CODE) FROM PARS_CANCOMPERSON WHERE USER_CODE=CODE) =1
还不行就把表usermiddel加上别名。
或换一种写法,用group..having或count()over()都行。追问
考,不是吧?只是ORACLE不能用别名还是全都这样?而且这个别名列的结果我还得在查询结果中使用,这样的话,岂不是很恶心
追答其它的没试过,可能都是这样。可以换一种写法。
参考技术B 你的别名是complain where 条件中用的是complaint追问汗。。。。不知道什么时候手贱按了个T,但是原因不是这个啊
SQL语句中,子句不能使用列别名问题
参考技术A 当select的表达式很长时,我们经常会用as子句为该表达式指定别名,然而却发现无法在Where条件中直接使用该别名作为判断条件.例如下面的SQL语句:
select id, (c1 + c2) as s from t1 where s > 100
运行会报错: “列名 s 无效”
当然,写成
select id, (c1 + c2) as s from t1 where (c1 + c2) > 100
就可以。
SQL语句中,为什么where子句不能使用列别名,而order by却可以?
在ORACLE中,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中,select语句的执行顺序是:
(1)FROM JOIN ON
(2)WHERE
(3)GROUP BY
(4)HAVING
(5)SELECT DISTINCT TOP()
(6)ORDER BY
由select语句的执行顺序,我们可以发现在where子句执行的时候,取别名的语句还没执行,即该别名不存在,自然就不能使用了,而order by的时候别名就已经命名好了。
我们还可以知道:如果在from子句中指定了表别名,那么它所在的select 语句中其他子句都必须使用表别名来代替原始的表名,因为from子句是select语句中最先被执行的。
以上是关于Oracle查询语句中重命名的列在WHERE中无效?的主要内容,如果未能解决你的问题,请参考以下文章
oracle 查询一列在第五位数字为5的所有字段 123456 232356 统计字段第五位为数字5的条数一共有多少条