Oracle查询语句中重命名的列在WHERE中无效?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle查询语句中重命名的列在WHERE中无效?相关的知识,希望对你有一定的参考价值。

我想做的操作是这样的,有一张用户表和一张用户的属性表,我想在查询用户信息的时候得到该用户是否包含属性的个数,每种属性在属性表中为一行记录,所以我就直接在查询时COUNT 了,但是竟然报错了
下面的查询怎么会出错?

单独查询的时候已经可以显示结果了,为什么在条件语句中使用别名列无效?
好吧,我什么时候手贱按了个T上去。。。

SELECT *
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学习 第一章 简单的查询语句 ——03

oracle 查询一列在第五位数字为5的所有字段 123456 232356 统计字段第五位为数字5的条数一共有多少条

Oracle - 查询语句 - 分组函数

在 Hive 表中重命名名称为 count( distinct( id )) 的列

字符串查询中的列在执行时没有被分隔