2012-09-21 72 views
1

「左外連接」我有一個簡單的SQL查詢:「如果不存在」與在Oracle SQL

SELECT 
     columnA, columnB, columnC... 
FROM 
     (SELECT  
      columnA, columnB, columnC... 
     FROM 
       SomeTable) Table1 
    WHERE NOT EXISTS 
     (SELECT 
       columnA 
      FROM 
       SomeOtherTable st 
      WHERE 
       st.columnB = Table1.columnB) 

誰能給我一個建議,如何改寫這個查詢有更好的表現?我的意思是在表1中包含WHERE NOT EXISTS條款。

+0

是子查詢'SELECT FROM(SELECT ...)'需要在查詢?沒有確切地看到優化器在做什麼,這很難說,但這可能是掛斷的地方。 –

+3

「更好的表現」完全取決於你自己的個人情況。您需要提供真正的查詢(儘可能小的版本來演示您想要改進的內容)表的結構,包括索引,您當前正在獲取的解釋計劃以及一些示例數據。只有這樣人們才能夠建立相同的環境並提供客觀的措施。現在,我很抱歉,但你的問題是無法回答的(或者至少你得到的答案意味着什麼也沒有)。 – Ben

+0

@lc。,似乎並不需要,但甲骨文通常會像不在那裏那樣行事,所以它沒有什麼區別。 – Ben

回答

5

您可以使用此:

select Table1.* 
from (select * from SomeTable) Table1 
left outer join SomeOtherTable sot 
    on Table1.columnB = sot.columnB 
where sot.columnB is null; 

對於性能有columnB兩個表的索引是很重要的。

+0

我不能使用這種形式,因爲在「哪裏不存在」的情況下,有一個Table1的同義詞 – slyder07

+0

@ slyder07:我不理解你的評論。請重新修飾它。沒有什麼能夠阻止你使用我提供的解決方案。 –

+0

我無法使用此表單,因爲在「where not exists」條件結尾處存在Table1的同義詞(...,其中st.columnB = ** Table1 **。columnB)。第二個表中的「where」條件指向Table1 – slyder07

0

如何:

SELECT columnA, columnB, columnC... 
FROM SomeTable 
WHERE (SELECT COUNT(*) FROM SomeOtherTable st WHERE st.columnB = SomeTable.columnB)=0; 
+0

我真的想刪除「哪裏不存在」,以獲得更好的性能,我真正的querry跑了半小時 – slyder07

+0

檢查第二張桌子的行數如何? – TechDo