高手请进--->>>解决SELECT语句

pt870219 2007-02-21 02:24:19
SELECT officecode FROM devproout.ala_lawoffice WHERE officecode IN(
SELECT p.officecode FROM devproout.ala_person p,devproout.ala_lawoffice l WHERE p.officecode =l.officecode(+) AND chief='2' GROUP BY p.officecode HAVING COUNT(*)<3

) OR officecode IN(
SELECT p.officecode FROM devproout.ala_lawpartner p,devproout.ala_lawoffice l WHERE p.officecode=l.officecode(+) AND l.chief<>'2' AND l.form<>4 GROUP BY p.officecode HAVING COUNT(*)<3

) OR officecode IN(

SELECT p.officecode FROM devproout.ala_person p,devproout.ala_lawoffice l WHERE p.officecode =l.officecode(+) AND p.persontype='1' AND form=4 GROUP BY p.officecode HAVING COUNT(*)<3

)

从这个SELECT语句,我要得到各个条件的officecode.
从而在父表中查询数据,就用了 officecode IN() OR office IN ()。但是子查询速度非常慢。
我的想法是,用一条SELECT语句写跟佳。从而避免数组相加。
请高手解决该SELECT。使之提高速度。
...全文
253 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
manyroads 2007-02-25
  • 打赏
  • 举报
回复
SELECT p.officecode FROM devproout.ala_person p,devproout.ala_lawoffice l WHERE p.officecode =l.officecode(+) AND chief='2' OR ( p.persontype='1' AND form=4) GROUP BY p.officecode HAVING COUNT(*)<3
union
SELECT p.officecode FROM devproout.ala_lawpartner p,devproout.ala_lawoffice l WHERE p.officecode=l.officecode(+) AND l.chief<>'2' AND l.form<>4 GROUP BY p.officecode HAVING COUNT(*)<3
manyroads 2007-02-25
  • 打赏
  • 举报
回复
SELECT p.officecode FROM devproout.ala_person p,devproout.ala_lawoffice l WHERE p.officecode =l.officecode(+) AND chief='2' GROUP BY p.officecode HAVING COUNT(*)<3
union
SELECT p.officecode FROM devproout.ala_lawpartner p,devproout.ala_lawoffice l WHERE p.officecode=l.officecode(+) AND l.chief<>'2' AND l.form<>4 GROUP BY p.officecode HAVING COUNT(*)<3
union
SELECT p.officecode FROM devproout.ala_person p,devproout.ala_lawoffice l WHERE p.officecode =l.officecode(+) AND p.persontype='1' AND form=4 GROUP BY p.officecode HAVING COUNT(*)<3
pt870219 2007-02-25
  • 打赏
  • 举报
回复
hevin(没有什么是不可能的) 有误
banboo02 2007-02-23
  • 打赏
  • 举报
回复
从执行效率上最好不要用in之类
要对表内所有数据作一次遍历。
hevin 2007-02-22
  • 打赏
  • 举报
回复
这个查询,从结构上可以简化成这样:

SELECT l.officecode
FROM devproout.ala_person p, devproout.ala_lawoffice l
WHERE p.officecode = l.officecode
AND ( l.chief = '2'
OR (l.chief <> '2' AND l.form <> 4)
OR (p.persontype = '1' AND l.form = 4)
)
GROUP BY l.officecode
HAVING COUNT (*) < 3;

可以不使用右+(left join)的原因是,三个条件子句
AND ( l.chief = '2'
OR (l.chief <> '2' AND l.form <> 4)
OR (p.persontype = '1' AND l.form = 4)
)

都有l表的字段条件,这种情况下使用右+(left join)是没有意义的,所以又可以直接GROUP BY l.officecode,直接SELECT l.officecode

以上仅是从语法角度分析,不知道实际运行结果如何,LZ可以试一下两个语句的查询结果,希望没有分析错。
chenkejun 2007-02-21
  • 打赏
  • 举报
回复
不过既然是count的条件,不用having也没太好的解决方法
chenkejun 2007-02-21
  • 打赏
  • 举报
回复
子查询里面的having,也会或多或少的影响效率。
chenkejun 2007-02-21
  • 打赏
  • 举报
回复
似乎你三个子查询结果合并起来,筛选掉重复的,就是结果。

3,492

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧