Sql 内部联接与Exists()的比较,同时避免重复行
这是一个复杂的问题,在我设置场景时请耐心等待: 假设我们有一个简化的表格设置,如下所示:Sql 内部联接与Exists()的比较,同时避免重复行,sql,oracle,oracle11g,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
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)
根据我提供的示例数据,这种情况可能一开始就没有意义,但我仍然想知道哪个查询“更好”使用。我想说使用EXISTS方法,因为除了检查是否存在之外,您实际上不需要从可用的\u员工那里得到任何东西。
话虽如此,这也取决于您的数据以及数据库查询优化器如何对其进行优化。我建议您查看每种方法的查询计划,看看哪一种更便宜。
同时检查这些链接我想说的是使用EXISTS方法,因为除了检查是否存在之外,您实际上并不需要任何来自可用员工的信息。
话虽如此,这也取决于您的数据以及数据库查询优化器如何对其进行优化。我建议您查看每种方法的查询计划,看看哪一种更便宜。
同时检查这些链接尽管您提供的第二个链接中的问题不一定相同,但它的公认答案确实回答了我的问题。谢谢。虽然你提供的第二个链接中的问题不一定相同,但它的公认答案确实回答了我的问题。谢谢