You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

你遗漏的关键点

  1. 必须用唯一标识关联船员:要用id_number来关联new_database和old_database,确保是同一位船员的新旧职业记录,而不是用职业差异作为连接条件。
  2. 选择合适的连接类型:需求要求的是“在职且新旧库都有记录”的船员,用INNER JOIN能精准匹配同时存在于三个表的记录,避免无效数据。
  3. 拼写规范:FULL OUTER JOIN的正确拼写是OUTER而非OUTTER。
  4. 表别名的使用:给表设置简洁清晰的别名(如nd、od、sd),能提升SQL的可读性和维护性。

内容的提问来源于stack exchange,提问作者Emily

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:23:09