這是一個複雜的問題,所以忍耐一下,因爲我設置了場景:內加入對是否存在(),同時避免重複行
說我們有一個簡單的表格設置像這樣:
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)
我可以用這個樣本數據來說明這種情況可能沒有意義,但我仍然想知道哪個查詢「更好」使用。
雖然您提供的第二個環節的問題不一定是相同的,因爲它接受的答案不回答我的問題。謝謝。 – Reimius 2013-02-18 17:51:48