一、关于标量子查询及伪代码表示
select ename, (select dname from dept d where d.deptno = e.deptno) dname
from emp e
where e.job in ('SALESMAN', 'ANALYST');
for i in (select distinct deptno from emp e where e.job in ('SALESMAN', 'ANALYST')):
select dname from dept d where d.deptno = i;
selet count(distinct deptno ) from emp e where e.job in ('SALESMAN', 'ANALYST');
二、标量子查询易产生的性能问题
三、标量子查询常规优化方案
四、案例分析
select t.num_id,
t.create_time,
1 if_3to4,
max(case
when (select count(1)
from dhoe tt
where tt.order_id = t.order_id
and tt.otype = '101') > 0 then
0
when (select count(1)
from dhoe tt
where tt.order_id = t.order_id
and tt.otype = '102') > 0 then
1
else
0
end) if_hk
from order t
where off_rype = '9601'
group by t.num_id, t.create_time;
select num_id,
create_time,
1 if_3to4,
max(case
when b.cnt101 > 0 then
0
when c.cnt102 > 0 then
1
else
0
end) if_hk
from (select t.num_id, t.create_time, 1 if_3to4, order_id
from order t
where off_rype = '9601') a
left outer join (select order_id,
count(case
when otype = '101' then
1
end) cnt101,
count(case
when otype = '102' then
1
end) cnt102
from dhoe
group by order_id) b
> group by num_id, create_time;
select count(*)
from wp_info ws
inner join wp_center wa
> where ws.status = 'VALID'
and wa.is_del = 'V'
and (select count(1)
from wp_bas wb
left join wp_rep wr
> where wb.WP_STATUS in (2, 3, 4)
and wr.is_valid = 'VALID'
and wr.created > sysdate - 7
and wr.service_no = ws.num) < ws.total_num;
select count(*)
from wp_info ws
inner join wp_center wa
> left join (select wr.service_no, count(1) cnt
from wp_bas wb
left join wp_rep wr
on wr.id = wb.id
where wb.WP_STATUS in (2, 3, 4)
and wr.is_valid = 'VALID'
and wr.created > sysdate - 7
group by wr.service_no) cc
> where ws.status = 'VALID'
and wa.is_del = 'V'
and nvl(cc.cnt, 0) < ws.total_num;
with t as
(select /*+ materialize */
wr.service_no
from wp_bas wb
left join wp_rep wr
> where wb.WP_STATUS in (2, 3, 4)
and wr.is_valid = 'VALID'
and wr.created > sysdate - 7)
select count(*)
from wp_info ws
left join wp_center wa
> where ws.status = 'VALID'
and wa.is_del = 'V'
and (select count(1) from t wr where wr.service_no = ws.num) <
ws.total_num;
UPDATE RE_RPT A
SET A.TCNT =
(SELECT NVL(SUM(G.REDCODE), 0)
FROM RP_GRANT G,
(SELECT DISTINCT REDCODE, REDCODE_MD5
FROM RP_SCAN) S,
IMT_CODE V,
(SELECT DISTINCT W_ID, NAME
FROM MATER
WHERE SUBSTR(ORDER, 1, 2) = 'OF'
AND W_ID IS NOT NULL) M
WHERE G.REDCODE = S.REDCODE
AND S.REDCODE_MD5 = V.N_CODE
AND V.W_CODE = M.W_ID
AND G.RP_CLASS = '有效'
AND G.CREATE_DATE = '2018-05-05'
AND A.NAME = M.NAME)
WHERE A.CHOOSE_TIME = '2018-05-05';
SQL> select count(distinct NAME)
2 from RE_RPT A
3 WHERE A.CHOOSE_TIME='2018-05-05';
COUNT(DISTINCTNAME)
---------------------------
257
MERGE INTO (select *
from RE_RPT A
WHERE A.CHOOSE_TIME = '2018-05-05') A
USING (SELECT M.NAME, SUM(G.REDCODE) SUM_CODE
FROM RP_GRANT G,
(SELECT DISTINCT REDCODE, REDCODE_MD5
FROM RP_SCAN) S,
IMT_CODE V,
(SELECT DISTINCT W_ID, NAME
FROM MATER
WHERE SUBSTR(ORDER, 1, 2) = 'OF'
AND W_ID IS NOT NULL) M
WHERE G.REDCODE = S.REDCODE
AND S.REDCODE_MD5 = V.N_CODE
AND V.W_CODE = M.W_ID
AND G.RP_CLASS = '有效'
AND G.CREATE_DATE = '2018-05-05')
group by M.NAME) M
ON (A.NAME = M.NAME(+))
when matched then
update set A.TCNT = nvl(SUM_CODE, 0);
五、总结