请教下oracle case when then 问题

SELECT UB.ID,
UB.UNAME,
UB.SHOPNAME,
(CASE
WHEN (SELECT COUNT(1) FROM CLIENTTRADE CL WHERE CL.CID = UB.ID) = 0 THEN
'0'
ELSE
'1'
END) AS MABNOTE
FROM USERSBASICINFO UB

有如上sql语句,请问是子查询语句先执行还是外面的先执行,
谁能说明一下这条sql的执行顺序.最好能祥细点.
还有这种查询有没有专业的名字什么的.

可以通过看oracle的执行计划来看执行顺序及效率。
首先执行case when 中的子查询;
然后检索USERSBASICINFO表中id项;
最后查询USERSBASICINFO表的全表数据来找满足要求的数据。

这就是很基本的查询,中间用到case when,case when中又嵌套了子查询,没有所谓的专业名称。追问

为什么会先执行子查询?
如果先执行子查询 那里面的UB.ID从哪里来?

追答

这就是oracle规定好的。你可以这样理解,先执行子查询,编译器发现需要UB.ID,然后又去查USERSBASICINFO表中的id,为了确定要查什么id,所以需要检索USERSBASICINFO表。
执行顺序就是这样的。
你理解的需要什么数据,那是依赖关系。二者不能混为一谈。

追问

假设USERSBASICINFO 表里有三万条数据.子查询需要到USERSBASICINFO 表里取三万次UB.ID,每取一次就拿到CLIENTTRADE 表里进行匹配,如果匹配成功,就把case when的结果追加到成功匹配的UB.ID那条数据的后面.
是这样理解吗?谢谢!

追答

是的。你可以这样理解。但是oracle内部什么情况我就不知道了。

追问

嗯,谢了.
你好,我再问最后一个问题.
假设 FROM USERSBASICINFO UB 的后面还有条件的话.
是不是要到最后的最后才会执行过滤?

追答

首先执行case when 中的子查询;
然后检索USERSBASICINFO表中id项;
最后查询USERSBASICINFO表,先过滤where条件来找满足要求的数据。

温馨提示:答案为网友推荐,仅供参考
相似回答