列出与普尔办公室目前具有相同专业知识的所有员工的姓名,身份和专业知识
架构:
Office(Office_ID,Office_Location)
员工(S_ID,S_Name,S_Expertise,Office_ID *)
我做了
SELECT S_Name, S_ID, S_Expertise
FROM Staff
WHERE S_Expertise IN(SELECT Office_Location
FROM Office
WHERE Office_Location = 'Poole Office');
答案 0 :(得分:5)
将您的问题分解为描述您需要的特定单位并逐步完成。如果你跳到最后只是复制代码,你将永远不会学习,所以请逐步完成这一步骤。
挑战:
列出所有拥有相同人员的姓名,身份和专业知识 目前在普尔办公室的专业知识
我们需要的事实:
1)职员姓名
2)职员ID
3)工作人员的专业知识
4)工作人员是否与其他员工分享专业知识 在普尔办公室工作的成员(不是他自己)。
我们拥有的信息:
职员:
1)职员ID
2)工作人员姓名
3)工作人员的专业知识
4)工作人员办公室
办公室:
1)办公室ID
2)办公地点
查看这两个表,看看你是否可以弄清楚它们是如何连接的。您是否看到名称相同的列?如果是这样,请在JOIN条件下使用它,如下所示:
SELECT *
FROM
Staff
INNER JOIN
Office ON
Staff.SomeColumn = Office.SomeColumn
大!现在我们已经列出了所有员工以及他们的办公室。
下一步是什么?接下来,我们必须将不在普尔办公室的工作人员与工作人员进行匹配。有一种称为" Self JOIN"在SQL中,您实际将表链接回自身。您可以通过为其提供称为别名的内容来实现此目的 - 您的查询可以使用的另一个名称。
SELECT *
FROM
Staff StaffNotInPooleOffice
INNER JOIN
Staff StaffInPooleOffice ON
????
我们如何关联这两个表?那么,你的病情是什么?您希望员工具有相同的专业知识。哦,你不想让那些拥有与自己相同的专业知识的员工回归 - 这将是愚蠢的。
SELECT *
FROM
Staff a -- StaffNotInPooleOffice
INNER JOIN
Staff b --StaffInPooleOffice
ON
a.S_ID != b.S_ID AND
a.S_Expertise = b.S_Expertise
实际上,这里有另一个要求。我们只希望退回Poole办公室的工作人员。我们现在就去办公室吧台......
SELECT *
FROM
Staff a -- StaffNotInPooleOffice
INNER JOIN
Staff b --StaffInPooleOffice
ON
a.S_ID != b.S_ID AND
a.S_Expertise = b.S_Expertise
INNER JOIN
Office c ON
b.Office_ID = c.Office_ID
WHERE c.Office_Location = 'Poole'
大!该WHERE
条款意味着b
中与a
的员工分享专业知识的员工必须来自普尔办事处。越来越近了!
新问题。如果Poole的多名员工拥有相同的专业知识,会发生什么?此查询会返回它们,而这不是我们想要的,所以让我们添加一个新的过滤器或JOIN条件。
SELECT *
FROM
Staff a -- StaffNotInPooleOffice
INNER JOIN
Staff b --StaffInPooleOffice
ON
a.S_ID != b.S_ID AND
a.S_Expertise = b.S_Expertise AND
a.Office_ID != b.Office_ID -- see what I did here? Now I know that the staff member in a isn't from the same place as the member in b.
INNER JOIN
Office c ON
b.Office_ID = c.Office_ID
WHERE c.Office_Location = 'Poole'
更接近。现在我觉得我们已经得到它了,所以让我们停止使用SELECT *
- 如果你把它放到生产环境中,你的服务器就会爆炸并融化你的键盘。认真。它是一个记录在案的功能。
SELECT a.S_Name, a.S_ID, a.S_Expertise
FROM
Staff a -- StaffNotInPooleOffice
INNER JOIN
Staff b --StaffInPooleOffice
ON
a.S_ID != b.S_ID AND
a.S_Expertise = b.S_Expertise AND
a.Office_ID != b.Office_ID -- see what I did here? Now I know that the staff member in a isn't from the same place as the member in b.
INNER JOIN
Office c ON
b.Office_ID = c.Office_ID
WHERE c.Office_Location = 'Poole'
是吗?实际上,我不知道!毕竟,这是你的餐桌。这是思考的过程,可以让你找到答案,如果你遵循它并检查我的代码,以确保它做我认为它做的,你会做得很好。
或者,当然,你可以随便让网上的人随便为你做功课。他们没有更好的事情要做。
答案 1 :(得分:0)
SELECT S_Name, S_ID, S_Expertise FROM
Staff WHERE Office_ID IN(SELECT Office_ID
FROM Office WHERE Office_Location = 'Poole Office');
答案 2 :(得分:-3)
您发布的查询可以简化为
SELECT S_Name, S_ID, S_Expertise
FROM Staff
WHERE S_Expertise = 'Poole Office'
但我不认为你正在寻找的逻辑。 我们不知道您尝试从Office获取的列名称应该用于将其与S_Expertise进行比较。 我们怎么知道呢? (参考你的评论"它应该是什么?)......