我正在尝试解决 Lost at SQL 中的“识别”挑战:
“开始日期”。该数据集为您提供有关员工的宝贵信息,包括他们的身份证号、出生日期 (DOB)、就业开始日期以及他们当前的就业状态。这似乎是一个很有前途的信息来源,可以帮助您拼凑出谜题。
“旧数据库”。该数据库包含有关员工及其先前职业的过时信息。虽然它可能不像您希望的那样最新,但它仍然可以提供有关员工的历史及其过去角色的一些有价值的见解。
“新数据库”。该数据集似乎更新了,包含有关员工及其当前就业状态的更新信息。它似乎是一个最新数据的金矿,有可能填补旧数据库留下的空白。
START_DATES -> id_number、date_of_birth、employment_start_date、employed_or_departed
NEW_DATABASE -> id_number、full_name、date_of_birth、职业
OLD_DATABASE -> 名字、姓氏、身份证号、出生日期、职业
获取一个包含 Full_Name、employment_start_date、latest_ocupation 和 previous_ocupation 列的表。应仅筛选出在 new_database 中与在 old_database 中具有不同角色且仍在工作的船员。
我试过了
SELECT full_name AS Full_Name, a.occupation AS latest_occupation, b.occupation AS previous_occupation, employment_start_date
FROM new_database
FULL OUTER JOIN old_database b ON b.occupation <> a.occupation
FULL OUTTER start_dates c ON a.id_number = c.id_number
WHERE employed_or_departed = 'Employed'
这给了我一个相同名字的列表,这些名字在所有不同的角色中重复了很多次。但这不是正确答案。
我也尝试过
SELECT full_name AS Full_Name, a.occupation AS latest_occupation, b.occupation AS previous_occupation, employment_start_date
FROM new_database
FULL OUTER JOIN old_database b ON a.id_number = b.id_number
FULL OUTTER start_dates c ON a.id_number = c.id_number
WHERE employed_or_departed = 'Employed' AND a.occupation<>b.occupation
什么才是正确答案?
我错过了什么?
我不知道为什么在这种情况下使用
FULL OUTER JOIN
,而你可以在这里简单地使用INNER JOIN
。这是查询:
SELECT
nd.full_name AS Full_Name,
sd.employment_start_date,
nd.occupation AS latest_occupation,
od.occupation AS previous_occupation
FROM
start_dates sd
INNER JOIN
new_database nd ON sd.id_number = nd.id_number
INNER JOIN
old_database od ON nd.id_number = od.id_number
WHERE
sd.employed_or_departed = 'Employed'
AND nd.occupation <> od.occupation;
您可以在此处查看示例小提琴