關於oracle中的半連線
表的連線在sql語句中尤為重要。外連線,內連線,半連線,反連線等等各種連線,看似簡單的一個連線裡面還是有不少的細節的。對於sql調優來說也是很重要的。
像下面的形式的sql就屬於半連線,使用了in子句,對於exists的實現也是屬於半連線。
--in半連線
SQL> select dname from dept dept where deptno in (select deptno from emp emp);
DNAME
--------------
RESEARCH
SALES
ACCOUNTING
--exists半連線
SQL> select dname from dept dept where exists (select null from emp emp where emp.deptno=dept.deptno)
2 /
DNAME
--------------
RESEARCH
SALES
ACCOUNTING
可能對於上面兩種連線大家不以為然,認為把需要用到的表直接放在from子句後效果是一致的,答案也不是肯定的。
比如下面的形式,可能輸出的結果就多了很多。大概14條記錄,但是透過半連線的方式會輸出3行記錄。
SQL> select dept.dname from dept dept,emp empwhere dept.deptno=emp.deptno;
DNAME
--------------
RESEARCH
SALES
SALES
RESEARCH
SALES
SALES
ACCOUNTING
RESEARCH
ACCOUNTING
SALES
RESEARCH
SALES
RESEARCH
ACCOUNTING
14 rows selected.
所以說如果要得到一個相同的輸出結果,還是需要distinct+inner join
SQL> select distinct dept.dname from dept dept,emp emp where dept.deptno=emp.deptno;
DNAME
--------------
ACCOUNTING
RESEARCH
SALES
對於半連線的可替換實現,大體有以下幾種方式
--使用集合
select dept.dname from dept dept,
(select deptno from dept
intersect
select deptno from emp emp)b
where dept.deptno=b.deptno ;
DNAME
--------------
ACCOUNTING
RESEARCH
SALES
--使用any
SQL> select dept.dname from dept dept where deptno=any(select deptno from emp emp);
DNAME
--------------
RESEARCH
SALES
ACCOUNTING
--使用distinct和內連線
SQL> select distinct emp.deptno from dept dept,emp emp
where dept.deptno=emp.deptno;
DEPTNO
----------
30
20
10
SQL> select distinct dept.deptno from dept dept,emp emp
where dept.deptno=emp.deptno;
DEPTNO
----------
30
20
10
大體說了下關於半連線的一些實現,可能在實際的使用中,最直觀的感受還是透過執行計劃來看到。
啟用了半連線,在執行計劃中會有semi的字樣。
也可以手動指定不需要走半連線。使用Hint no_semijoin
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1346962/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【經典】連線oracle的總結(關於tnsname和監聽)Oracle
- 關於oracle中的undoOracle
- 備忘錄:關於.net程式連線Oracle資料庫Oracle資料庫
- 【JDBC】使用OracleDataSource建立連線池用於連線OracleJDBCOracle
- 關於面向連線與面向無連線
- Oracle 19c中連線RMAN客戶端的連線方法Oracle客戶端
- SpringBoot中關於 HikariPool、Druid及常用連線池的比較Spring BootUI
- 關於canonmx538無線連線的問題
- Mysql關於長連線短連線優劣比較MySql
- [20200711]關於左右連線的問題.txt
- 關於 Homestead 連線 MySQL 問題MySql
- cx_Oracle 連線 OracleOracle
- thinkphp連線OraclePHPOracle
- PHP 連線 OraclePHPOracle
- PHP 連線oraclePHPOracle
- Servlet連線OracleServletOracle
- SQL 改寫系列十:半連線轉內連線SQL
- 在Hibernate中關於Oracle sequence的使用KHOracle
- 關於外連線和where條件
- 關於在執行java連線MongoDB時遇到的連線超時問題JavaMongoDB
- tcp的半連線攻擊和全連線攻擊--TCP DEFER ACCEPTTCP
- 從原始碼中分析關於phpredis中的連線池可持有數目原始碼PHPRedis
- oracle 連線查詢Oracle
- DBA ORACLE連線操作Oracle
- 3.2.2 python連線oraclePythonOracle
- 關於oracle的Spool命令Oracle
- Oracle:優化方法總結(關於連表查詢)Oracle優化
- TCP 三次握手原理以及半連線和全連線TCP
- 關於oracle資料庫全形數字轉換半形數字方法Oracle資料庫
- Oracle左外連線、右外連線、完全外連線以及(+)號用法Oracle
- Oracle連線Db2OracleDB2
- [Oracle-> MySQL] Oracle通過dblink連線MySQL--Oracle 19c連線到MySQL 5.7OracleMySql
- python連線Oracle的外掛cx_Oracle安裝PythonOracle
- 關於MacBook Pro 15 usb連線iPhone反覆重連的解決辦法MaciPhone
- 微課sql最佳化(15)、表的連線方法(4)-關於Hash Join(雜湊連線)SQL
- 微課sql最佳化(16)、表的連線方法(5)-關於Merge Join(排序合連線)SQL排序
- T-SQL——關於跨庫連線查詢SQL
- java操作Oracle 方式一 ( 連線-》操作-》斷開連線 )JavaOracle
- 【JDBC】java連線池模擬測試 連線oracleJDBCJavaOracle