暂无图片
Oracle 复杂sql如何分析
我来答
分享
hzdba
2019-10-12
Oracle 复杂sql如何分析

如下一个sql语句,怎么分析是怎么进行关联的,unid是doc表的字段,看样子了unid做条件传进去,但是里面有多个子查询,一下子就高的很迷糊了

SELECT documents.*, (select 1 from dual) status FROM doc where exists (select 1 from ACL a left join ow o on a.ownerid=o.id whEre unid=a.WORKID and ((a.OWNERID = '*' and not exists (select 1 from doc_read wheRe unid=doc_read.docid and (readerid = '2c9186830dbefd07010dc9cb2b420144')) and not exists (select 1 from DOC_DELETE d wheRe unid=d.docid and (d.ownerid = '2c9186830dbefd07010dc9cb2b420144') and d.type='shou') ) or (o.flag=1 and a.OWNERID in ('2c9186830dbefd07010dc9cb2b420144') and not exists (select 1 from doc_read wheRe unid=doc_read.docid and (readerid = '2c9186830dbefd07010dc9cb2b420144')) and not exists (select 1 from DOC_DELETE d wheRe unid=d.docid and (d.ownerid = '2c9186830dbefd07010dc9cb2b420144') and d.type='shou') )))

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
文成

可能用个客户端工具美化一下格式就看清楚了,这个表首先会报错,因为 DOCUMENTS。* 不存在,其次 doc关联列没有传入到 exists中去,所以返回的是doc中所有的记录

SELECT DOCUMENTS.*, (SELECT 1 FROM DUAL) STATUS
  FROM DOC
 WHERE EXISTS (SELECT 1
          FROM ACL A
          LEFT JOIN OW O
            ON A.OWNERID = O.ID
         WHERE UNID = A.WORKID
           AND ((A.OWNERID = '*' AND NOT EXISTS
                (SELECT 1
                    FROM DOC_READ
                   WHERE UNID = DOC_READ.DOCID
                     AND (READERID = '2c9186830dbefd07010dc9cb2b420144')) AND
                NOT EXISTS (SELECT 1
                               FROM DOC_DELETE D
                              WHERE UNID = D.DOCID
                                AND (D.OWNERID =
                                    '2c9186830dbefd07010dc9cb2b420144')
                                AND D.TYPE = 'shou')) OR
               (O.FLAG = 1 AND
               A.OWNERID IN ('2c9186830dbefd07010dc9cb2b420144') AND
               NOT EXISTS
                (SELECT 1
                    FROM DOC_READ
                   WHERE UNID = DOC_READ.DOCID
                     AND (READERID = '2c9186830dbefd07010dc9cb2b420144')) AND
                NOT EXISTS (SELECT 1
                               FROM DOC_DELETE D
                              WHERE UNID = D.DOCID
                                AND (D.OWNERID =
                                    '2c9186830dbefd07010dc9cb2b420144')
                                AND D.TYPE = 'shou'))))


暂无图片 评论
暂无图片 有用 0
hzdba

SELECT doc.*, (select 1 from dual) status FROM doc where exists (select 1 from ACL a left join ow o on a.ownerid=o.id whEre unid=a.WORKID and ((a.OWNERID = '*' and not exists (select 1 from doc_read wheRe unid=doc_read.docid and (readerid = '2c9186830dbefd07010dc9cb2b420144')) and not exists (select 1 from DOC_DELETE d wheRe unid=d.docid and (d.ownerid = '2c9186830dbefd07010dc9cb2b420144') and d.type='shou') ) or (o.flag=1 and a.OWNERID in ('2c9186830dbefd07010dc9cb2b420144') and not exists (select 1 from doc_read wheRe unid=doc_read.docid and (readerid = '2c9186830dbefd07010dc9cb2b420144')) and not exists (select 1 from DOC_DELETE d wheRe unid=d.docid and (d.ownerid = '2c9186830dbefd07010dc9cb2b420144') and d.type='shou') )))

不好意思sql是上面这样的,在子查询里面unid这个字段是在表doc上面的,unid=a.workid这个不是把doc的unid值传给a.workid吗?我先搞不清楚的是这个sql是先把where exists里面的所有结果查询出来在进行exsits吗,这样的话unid这个链接条件怎么用。。。求大神指导下

暂无图片 评论
暂无图片 有用 0
沈宏

用explain for select 。。。获得执行计划,看执行计划

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏