我正在做这个练习。
问题4的目标是找到在"琼斯"之后被雇佣的员工。我认为这个问题可以不用像这样的连接来解决:
SELECT first_name, last_name, hire_date
FROM employees
WHERE hire_date > (
SELECT hire_date FROM employees WHERE last_name = "Jones"
)
但是网站上的答案是:
SELECT e.first_name, e.last_name, e.hire_date
FROM employees e
JOIN employees davies
ON (davies.last_name = "Jones")
WHERE davies.hire_date < e.hire_date;
这些答案大致相同还是有理由认为第二个答案更好?
我假设列last_name
被定义为UNIQUE
,因此第一个查询中的子查询只返回1行。
如果不是,那么查询不会返回相同的结果,因为尽管第一个查询中的子查询可能返回多于1行(并且在其他数据库中查询甚至不会运行),SQLite将只选择返回的第一行并使用其hire_date
将其与表的所有行进行比较,而连接将使用last_name = "Jones"
的所有行
如果我的假设是正确的,那么这两个查询是等效的,但第一个是我建议的,因为它更具可读性,我相信它会比连接执行得更好。如果我必须使用连接来满足这个要求(因为这是作业),我会选择一个更容易读的形式:
SELECT e.first_name, e.last_name, e.hire_date
FROM employees e
JOIN (SELECT * FROM employees WHERE last_name = "Jones") t
ON t.hire_date < e.hire_date;