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