2014-10-16 55 views
0

我有以下表格和數據。select語句上的NOOB查詢

錯誤

bug_id creator category_id change_request_id 
1  john  101   123 
2  mark  124   124 
3  mark  139   135 
4  shane  167   148 
6  logan  278   234 

類別

id owner category_name 
101 mark abc 
124 john def 
139 mark ghi 
167 mark jkl 
278 mark mno 

Change_request

id creator 
123 mark 
124 mark 
135 mark 
148 john 
234 mark 

我需要提取所有來自bug表的創建者字段值爲john或其類別所有者爲約翰(這只是類別表的所有者字段)或其變更請求「創建者」爲約翰的bug。

我寫了一個簡單的SELECT語句來實現這一

SELECT bug_id 
    FROM bugs 
    ,category 
    ,change_request 
WHERE ((bugs.creator = 'john' 
      ) 
      OR ((bugs.category_id = category.id 
        ) 
       AND (category.owner = 'john' 
        ) 
      ) 
      OR ((bugs.change_request_id = change_request.id 
        ) 
       AND (change_request.creator = 'john' 
        ) 
      ) 
     ); 

但是當我使用上面的查詢,需要很長時間來執行。我所有的表格列都被正確編入索引。有沒有優化的查詢來解決我的目的?

+0

10g? 11克?哪一個? – GolezTrol 2014-10-16 18:09:04

+1

避免使用不贊成使用的語法,使用標準的'JOIN'語法將更簡潔,更容易排除故障。 – 2014-10-16 18:09:24

回答

2

查詢優化器可以處理起來更容易:

SELECT bug_id 
    FROM bugs 
    JOIN category ON bugs.category_id = category.id 
    JOIN change_request ON bugs.change_request_id = change_request.id 
WHERE (bugs.creator = 'john') 
    OR (category.owner = 'john') 
    OR (change_request.creator = 'john'); 

你可以寫用逗號操作,只有WHERE謂詞同樣的事情,但由此產生的where子句將不會是相同的你(雖然它會以同樣的方式評估)。

+0

非常感謝您的答覆。投票並標記爲答案 – user2686860 2014-10-16 18:47:27

1

要添加到John Bollinger的答案,原因爲什麼它花費太長時間是因爲結果笛卡爾加入您的WHERE條款。 WHERE子句中的OR使聯接條件不是強制性的。

例如,如果bugs.creatorJOHN,你的其他謂詞被忽略導致JOHN記錄都categorychange_request表中加入了與ALL記錄。

John的查詢將消除這種不良影響,因爲它正確地將連接條件和過濾器謂詞放在它們所屬的位置。

+0

感謝您解釋這一點。投票 – user2686860 2014-10-16 18:47:42