SQL挑战求解:找出新旧库角色不同且在职的船员
Lost at SQL "Identify" 挑战:正确SQL写法及问题分析
需求回顾
获取包含Full_Name、employment_start_date、latest_occupation、previous_occupation的结果集,筛选出新旧数据库中职业不同且当前仍在职的船员。
你的SQL存在的问题
第一段SQL的核心错误
- 连接逻辑完全错误:用
b.occupation <> a.occupation作为new_database和old_database的连接条件,这会把所有职业不同的船员记录强行关联,导致大量重复数据,完全没有匹配同一位船员。 - 拼写错误:
FULL OUTTER应为FULL OUTER JOIN。 - 连接类型不合理:全外连接会引入无匹配的NULL记录,不符合“在职且新旧库都有记录”的需求。
第二段SQL的问题
- 仍存在拼写错误
FULL OUTTER; - 不必要的全外连接:虽然WHERE条件会过滤掉NULL,但用INNER JOIN更直接严谨,避免无效关联;
- 字段关联的可读性不足:没有给表设置清晰的别名,容易混淆。
正确SQL写法
SELECT nd.full_name AS Full_Name, nd.occupation AS latest_occupation, od.occupation AS previous_occupation, sd.employment_start_date FROM new_database nd INNER JOIN old_database od ON nd.id_number = od.id_number INNER JOIN start_dates sd ON nd.id_number = sd.id_number WHERE sd.employed_or_departed = 'Employed' AND nd.occupation <> od.occupation;
你遗漏的关键点
- 必须用唯一标识关联船员:要用
id_number来关联new_database和old_database,确保是同一位船员的新旧职业记录,而不是用职业差异作为连接条件。 - 选择合适的连接类型:需求要求的是“在职且新旧库都有记录”的船员,用
INNER JOIN能精准匹配同时存在于三个表的记录,避免无效数据。 - 拼写规范:
FULL OUTER JOIN的正确拼写是OUTER而非OUTTER。 - 表别名的使用:给表设置简洁清晰的别名(如
nd、od、sd),能提升SQL的可读性和维护性。
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

