刚刚毕业到公司,看这么长的SQL有点困难。例如:
 select * from 
( select s.*,row_number() over(ORDER BY rownum) id_tj, COUNT(1) over() ID_TJ_ALL from  
(SELECT DISTINCT * FROM 
(select sl.yxtywlsh, sl.ywlsh, sl.xmmc,t.blzt,sl.sjbbh, sl.spsxbh, sl.spsxzxbh, sl.spsxbh || '-' || sl.spsxzxbh as SPSXZX, sl.slsj, sl.sqdwhsqrxm, sl.status,'sl' as type from t_jc_xzxk_busiindex t, t_jc_xzxk_shouli sl where sl.ywlsh=t.ywlsh(+) and sjbbh = 
(select max(sjbbh)  from t_jc_xzxk_shouli  where ywlsh = sl.ywlsh)   and sl.spsxbh||'-'||sl.spsxzxbh in (SELECT B.ID||'-'||B.ITEMS  FROM T_JC_XZXK_PERMISSIONOFGROUP A, T_JC_XZXK_PERMISSIONITEMSYS B, T_SYS_USEROFUSERGROUP C  WHERE A.XKSXBH = B.ID  AND A.XKSXZX = B.ITEMS  AND C.USERGROUPID = A.USERGROUPID  AND A.STATUS = 1  AND B.STATUS = 1  AND C.STATUS = 1  AND C.USERID = '999999999999999' and b.version = 
(select max(version) from t_jc_xzxk_permissionitemsys where id=b.id and items=b.items) )  UNION ALL select wssl.yxtywlsh, wssl.ywlsh,wssl.byzda as xmmc,v.blzt,wssl.sjbbh, wssl.spsxbh, wssl.spsxzxbh, wssl.spsxbh || '-' || wssl.spsxzxbh as SPSXZX, wssl.wstjsj AS slsj, wssl.sqrhsqdw as sqdwhsqrxm, '-1' as status,'wssl' as type from t_jc_xzxk_busiindex v,t_jc_xzxk_wangshangshouli wssl where wssl.ywlsh = v.ywlsh(+) and wssl.spsxbh||'-'||wssl.spsxzxbh in (SELECT B.ID||'-'||B.ITEMS  FROM T_JC_XZXK_PERMISSIONOFGROUP A, T_JC_XZXK_PERMISSIONITEMSYS B, T_SYS_USEROFUSERGROUP C  WHERE A.XKSXBH = B.ID  AND A.XKSXZX = B.ITEMS  AND C.USERGROUPID = A.USERGROUPID  AND A.STATUS = 1  AND B.STATUS = 1  AND C.STATUS = 1  AND C.USERID = '999999999999999' and b.version = 
(select max(version) from t_jc_xzxk_permissionitemsys where id=b.id and items=b.items) ) and  sjbbh = 
(select max(sjbbh)   from t_jc_xzxk_wangshangshouli  where ywlsh = wssl.ywlsh) and not exists 
(select 1 from t_jc_xzxk_shouli where ywlsh = wssl.ywlsh) 
and wssl.status in ('1', '2')) wssl WHERE 1=1  and (wssl.blzt < 9 
or wssl.blzt is null)  ORDER BY wssl.slsj desc,wssl.ywlsh,wssl.sjbbh desc) s )
 where id_tj between 1 and 10

解决方案 »

  1.   

    1. 首先要清楚这个查询中用到的表和字段的语义,就是每个表每个字段都存储是什么数据。
    2. 要知道所查询的字段的数据类型
    3. 不要着急,一段一段地把SQL语句拆开来理解。我想这肯定是已经完成的项目中的SQL语句,可以结合这个项目的界面的的操作来更快的理解(主要是看一下这个界面都涉及到了哪些数据)。
      

  2.   

    把这个sql,发到pl/sql工具里,使用美化器格式化。
    然后逻辑就比较清晰了,可以看要查询的目标字段是哪个,从哪个表取。
      

  3.   


     例如这语句本来是procedure里面,
     有多个子查询,是不是应该从最下层的子查询逐步想上层延伸了?
      

  4.   

     SQL美化器真的很管用,但是逻辑思维上有点小问题。
     可能是经验问题吧。
      

  5.   

    1.看别人的SQL,关键还是从需求着手---实现什么功能,涉及到的表归纳出来,查看这些表字段的注释2,代码规范问题-------自己写的时候,注意SQL注释说明ps:希望对你有所帮助