2013-02-18 21 views
2

這是一個複雜的問題,所以忍耐一下,因爲我設置了場景:內加入對是否存在(),同時避免重複行

說我們有一個簡單的表格設置像這樣:

table 1(employee): { 
    employee_id, -primary key 
    first_name, 
    last_name, 
    days_of_employment 
} 
with data: 
employee_id first_name last_name days_of_employment 
111   Jack  Stevens 543 
222   Clarice Bobber 323 
333   Roy  Cook  736 
444   Fred  Roberts 1000 
... 

table 2(teams): { 
    team_code, --primary key 
    description 
} 
with data: 
team_code description 
ERA  Enrollment Records Assoc. 
RR  Rolling Runners 
FR  French Revolution 
... 

table 3(employees_teams):{ 
    employee_id, --primary key 
    team_code --primary key 
} 
with data: 
employee_id team_code 
111   RR 
111   FR 
222   FR 
222   ERA 
333   FR 
... 

我希望這些表格應該清楚它們是什麼以及它們的目的。以下是我的要求:「我希望在滾動和參賽記錄協會團隊中僱傭員工的平均日數。」我知道如何編寫這個查詢有兩種方式,它們似乎工作得很好,但我真正想知道的是oracle數據庫處理哪一種更快。請記住,這些查詢被寫入他們是從生產重複行保持的方式這將搞砸了平均計算:

查詢1:

SELECT AVG(e.days_of_employment) avg_days_of_employment 
FROM employee e, 
     (
     SELECT DISTINCT employee_id 
     FROM employees_teams 
     WHERE team_code IN ('ERA','RR')) available_employees 
WHERE e.employee_id = available_employees.employee_id 

查詢2:

SELECT AVG(e.days_of_employment) avg_days_of_employment 
FROM employee e 
WHERE EXISTS(
    SELECT 1 
    FROM employees_teams et 
    WHERE et.team_code IN ('ERA','RR') 
     AND et.employee_id = e.employee_id) 

我可以用這個樣本數據來說明這種情況可能沒有意義,但我仍然想知道哪個查詢「更好」使用。

回答

4

我會說,去與EXISTS方法,因爲你是不是真的需要任何從available_employees除了檢查存在。
說了它也取決於您的數據以及數據庫查詢優化器如何優化它。我建議您查看每種方法的查詢計劃,並查看哪種方案更便宜。

檢查這些鏈接,以及http://dotnetvj.blogspot.com/2009/07/why-we-should-use-exists-instead-of.htmlCan an INNER JOIN offer better performance than EXISTS

+0

雖然您提供的第二個環節的問題不一定是相同的,因爲它接受的答案不回答我的問題。謝謝。 – Reimius 2013-02-18 17:51:48