为什么这 2 个查询 return 来自 Oracle hr 数据库的不同结果?
Why do these 2 queries return different results from the Oracle hr database?
select J.job_title,
D.department_name,
E.first_name || ' ' || E.last_name as "Employee Name",
H.start_date
from job_history H
join jobs J
on H.job_id = J.job_id
join departments D
on H.department_id = D.department_id
join employees E
on H.department_id = E.department_id
where H.start_date between '01-Jan-93' and '03-Aug-97';
第二次查询
SELECT job_title,
department_name,
first_name || ' ' || last_name AS Employee_name,
start_date
FROM job_history
JOIN jobs USING (job_id)
JOIN departments USING (department_id)
JOIN employees USING (employee_id)
WHERE start_date between '01-jan-93' AND '08-aug-97';
您会得到不同的答案(第一个查询中有更多行,这很可能是错误的查询)因为在第一个查询中您将最后一个 table、employees
加入到第一个 table、job_history
,在 department_id
列。 (在第二个查询中,您通过 employee_id
加入,这可能是正确的方式。)
这样,对于 job_history
中匹配的每一行和 employees
table department_id
列中的员工 您将在连接输出中获得一行 - 即使该员工与员工 ID 不匹配 job_history
行。 Executive
部门的所有 名员工将出现在输出中。
请注意,您的 where
条款不相同(一个期间在 8 月 3 日结束,另一个在 8 月 8 日结束),但不是不同的原因输出。 (虽然它可能在不同的数据上。)
另外,他们应该教你不要在日期比较中使用字符串;但这与你的问题无关。
select J.job_title,
D.department_name,
E.first_name || ' ' || E.last_name as "Employee Name",
H.start_date
from job_history H
join jobs J
on H.job_id = J.job_id
join departments D
on H.department_id = D.department_id
join employees E
on H.department_id = E.department_id
where H.start_date between '01-Jan-93' and '03-Aug-97';
第二次查询
SELECT job_title,
department_name,
first_name || ' ' || last_name AS Employee_name,
start_date
FROM job_history
JOIN jobs USING (job_id)
JOIN departments USING (department_id)
JOIN employees USING (employee_id)
WHERE start_date between '01-jan-93' AND '08-aug-97';
您会得到不同的答案(第一个查询中有更多行,这很可能是错误的查询)因为在第一个查询中您将最后一个 table、employees
加入到第一个 table、job_history
,在 department_id
列。 (在第二个查询中,您通过 employee_id
加入,这可能是正确的方式。)
这样,对于 job_history
中匹配的每一行和 employees
table department_id
列中的员工 您将在连接输出中获得一行 - 即使该员工与员工 ID 不匹配 job_history
行。 Executive
部门的所有 名员工将出现在输出中。
请注意,您的 where
条款不相同(一个期间在 8 月 3 日结束,另一个在 8 月 8 日结束),但不是不同的原因输出。 (虽然它可能在不同的数据上。)
另外,他们应该教你不要在日期比较中使用字符串;但这与你的问题无关。