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

解决方案 »

  1.   

    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
      

  2.   

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

  3.   

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

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

  4.   

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

  5.   

    照你的意思数据库里面的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
      

  6.   

    终于明白了,感谢啊!我理解成了SPAR_MODULE_ID和SMODULE_ID的对比了!而且遇到decode,被搞晕了。
      

  7.   

    终于明白了,感谢啊!我理解成了SPAR_MODULE_ID和SMODULE_ID的对比了!而且遇到decode,被搞晕了。
    遇到看不明白的SQL,最好的办法是将SQL进行分割,从里到外分步执行,通过看执行结果能够给你很大的帮助
      

  8.   

    其实楼主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效果。