select a.username,(select count(*) from all_objects b where b.owner=a.username) cnt from all_users a;
create table a as select * from all_users;
create table b as select * from all_objects;
select a.username,(select count(*) from b where b.owner=a.username) cnt from a;
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID 2q0bhbzak85z9, child number 0
-------------------------------------
select a.username,(select count(*) from b where b.owner=a.username) cnt
from a
Plan hash value: 3049668959
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 36 |00:00:00.01 | 6 | 0 |
| 1 | SORT AGGREGATE | | 36 | 1 | 36 |00:00:01.09 | 36756 | 36648 |
|* 2 | TABLE ACCESS FULL| B | 36 | 780 | 43773 |00:00:01.02 | 36756 | 36648 |
| 3 | TABLE ACCESS FULL | A | 1 | 36 | 36 |00:00:00.01 | 6 | 0 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("B"."OWNER"=:B1)
Note
-----
- dynamic sampling used for this statement (level=2)
25 rows selected.
标量子查询会执行传入的值 DISTINCT那么多次,这里传入的值是a.username 就是distinct(a.username)次
SQL>
select count(distinct a.username) from a;SQL>
COUNT(DISTINCTA.USERNAME)
-------------------------
36
改写成左链接:
select a.username,nvl(b.cnt,0) from a left join (select count(*) cnt ,b.owner from b group by b.owner ) b
on b.owner = a.username
select a.username,count(b.owner) from a left join b on b.owner=a.username group by a.username