NOT IN、NOT EXISTS的相關子查詢改用LEFT JOIN--sql2000效能優化

weixin_33941350發表於2016-07-08
參考文章:SQL SERVER效能優化綜述(很好的總結,不要錯過哦)

資料庫:系統資料庫

子查詢的用法


         子查詢是一個 SELECT 查詢,它巢狀在 SELECT、INSERT、UPDATE、DELETE 語句或其它子查詢中。任何允許使用表示式的地方都可以使用子查詢。子查詢可以使我們的程式設計靈活多樣,可以用來實現一些特殊的功能。但是在效能上,往往一個不合適的子查詢用法會形成一個效能瓶頸。
          如果子查詢的條件中使用了其外層的表的欄位,這種子查詢就叫作相關子查詢。相關子查詢可以用IN、NOT IN、EXISTS、NOT EXISTS引入。 關於相關子查詢,應該注意:


(1)NOT IN的相關子查詢可以改用LEFT JOIN代替寫法。比如:

SELECT PUB_NAME FROM PUBLISHERS 
WHERE PUB_ID NOT IN (SELECT PUB_ID 
FROM TITLES 
WHERE TYPE = 'BUSINESS') 

我們用左外連線語句對上面的語句進行替換,先看下面的語句,PUBLISHERS 表與TITLES表進行左外連線

SELECT A.PUB_NAME,B.pub_id FROM PUBLISHERS A LEFT JOIN TITLES B 
ON B.TYPE = 'BUSINESS' AND A.PUB_ID=B. PUB_ID 

根據要求,我們只要查詢出上面pub_id為空的就行,對語句進行如下改進:

 

(2)NOT EXISTS的相關子查詢可以改用LEFT JOIN代替寫法。比如:



相關文章