内部连接与存在()同时避免重复行

时间:2013-02-18 17:29:47

标签: sql oracle oracle11g

这是一个复杂的问题,所以在设置场景时请耐心等待:

假设我们有一个简化的表格设置:

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
...

我希望这些表格应该清楚它们是什么以及它们的用途。以下是我的要求情景:“我希望员工在Rolling Runners和Enrollment Records Assoc。团队中的平均就业天数。”有两种方法我知道如何编写这个查询,它们似乎都运行得很好,但我真正想知道的是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)

有可能通过这个示例数据我提供了这种情况可能没有意义,但我仍然想知道哪个查询“更好”使用。

1 个答案:

答案 0 :(得分:4)

我会说使用EXISTS方法,因为除了检查存在之外,你并不需要来自available_employees的任何东西。
说完它取决于你的数据以及数据库查询优化器如何优化它。我建议你看看每种方法的查询计划,看看哪一种更便宜。

同时检查这些链接http://dotnetvj.blogspot.com/2009/07/why-we-should-use-exists-instead-of.html Can an INNER JOIN offer better performance than EXISTS