当前位置: 代码迷 >> Oracle管理 >> 有句SQL语句看不懂求帮忙解释下解决方案
  详细解决方案

有句SQL语句看不懂求帮忙解释下解决方案

热度:245   发布时间:2016-04-24 04:15:20.0
有句SQL语句看不懂求帮忙解释下
  select SMODULE_ID id,SMODULE_NAME text,SMODULE_URL url,SICON iconCls,
      decode((select count(1) from T_SM_MODULE m1 where SPAR_MODULE_ID=m2.SMODULE_ID),0,1,0)   leaf   from T_SM_MODULE m2
------解决方案--------------------
引用:
  select SMODULE_ID id,SMODULE_NAME text,SMODULE_URL url,SICON iconCls,
      decode((select count(1) from T_SM_MODULE m1 where SPAR_MODULE_ID=m2.SMODULE_ID),0,1,0)   leaf   from T_SM_MODULE m2


decode((select count(1)
                from T_SM_MODULE m1
               where SPAR_MODULE_ID = m2.SMODULE_ID),
              0,
              1,
              0)
 子查询,查找主查询中以每条记录的SPAR_MODULE_ID为SMODULE_ID的记录条数,如果条数为0则返回1,否则返回0
------解决方案--------------------
decode类似于case when的逻辑
decode((select count(1) from T_SM_MODULE m1 where SPAR_MODULE_ID=m2.SMODULE_ID),0,1,0) 
相当于
case when (select count(1) from T_SM_MODULE m1 where SPAR_MODULE_ID=m2.SMODULE_ID)=0 then 1 else 0 end

------解决方案--------------------
引用:
Quote: 引用:

decode((select count(1)
                from T_SM_MODULE m1
               where SPAR_MODULE_ID = m2.SMODULE_ID),
              0,
              1,
              0)
 子查询,查找主查询中以每条记录的SPAR_MODULE_ID为SMODULE_ID的记录条数,如果条数为0则返回1,否则返回0

数据库里面的SPAR_MODULE_ID和SMODULE_ID都不同   
但是执行SQL语句之后就

怎么了。数据不对还是怎么?不明白你的问题所在
------解决方案--------------------
引用:
Quote: 引用:

怎么了。数据不对还是怎么?不明白你的问题所在

照你的意思数据库里面的SPAR_MODULE_ID ,SMODULE_ID数据库里面应该都不同啊,那么怎么leaf那里会有01之分呢

根据你的数据来解释吧。
比如第一条数据SMODULE_ID=0131,SPAR_MODULE_ID =01
在执行子查询的时候,就变成
decode((select count(1)
                 from T_SM_MODULE m1
                where SPAR_MODULE_ID = ‘0131’),
               0,
               1,
               0)
这是就相当于在T_SM_MODULE 寻找SPAR_MODULE_ID = ‘0131’的记录数,根据你的结果来看,应该不存在这样的记录,所以子查询返回记录数为0,然后通过decode来处理,整个表达式的返回值为1。
在比如SMODULE_ID=02这条数据
很明显在表T_SM_MODULE 存在SPAR_MODULE_ID = ‘02’的数据(截图的第二条数据),此时子查询返回的是非0的记录条数,通过decode处理后返回值为0
------解决方案--------------------
其实楼主decode就是java里面的三目运算符,当然是可以无限嵌套。
select decode(code,1,0,1) from dual 类似于 code==1?0:1
and more:
select decode(code,1,'一','2','二','3','三','E') from table_name 类似于code==1?'一':(code==2?'二':(code==3?'三':'E'))
Tips:假如楼主decode有未包含的情况返回空。如
select decode(code,1,'ONE',2,'TWO') from dual 遇到code为3,但是未写最后的else效果。
  相关解决方案