-3 sql sql-server mysqli
列出与普尔办公室目前具有相同专业知识的所有员工的姓名,身份和专业知识
架构:
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');
Run Code Online (Sandbox Code Playgroud)
将您的问题分解为描述您需要的特定单位并逐步完成.如果你跳到最后只是复制代码,你将永远不会学习,所以请逐步完成这一步骤.
挑战:
列出与普尔办公室目前具有相同专业知识的所有员工的姓名,身份和专业知识
我们需要的事实:
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
Run Code Online (Sandbox Code Playgroud)
大!现在我们已经列出了所有员工以及他们的办公室.
接下来是什么?接下来,我们必须将不在普尔办公室的工作人员与工作人员进行匹配.在SQL中有一种叫做"自我加入"的东西,你实际上将表链接回自身.您可以通过为其提供所谓的别名 - 您的查询可以使用的另一个名称来实现此目的.
SELECT *
FROM
Staff StaffNotInPooleOffice
INNER JOIN
Staff StaffInPooleOffice ON
????
Run Code Online (Sandbox Code Playgroud)
我们如何关联这两个表?那么,你的病情是什么?您希望员工具有相同的专业知识.哦,你不想让那些拥有与自己相同的专业知识的员工回归 - 这将是愚蠢的.
SELECT *
FROM
Staff a -- StaffNotInPooleOffice
INNER JOIN
Staff b --StaffInPooleOffice
ON
a.S_ID != b.S_ID AND
a.S_Expertise = b.S_Expertise
Run Code Online (Sandbox Code Playgroud)
实际上,这里有另一个要求.我们只希望退回非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'
Run Code Online (Sandbox Code Playgroud)
大!该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'
Run Code Online (Sandbox Code Playgroud)
更接近.现在我认为我们已经拥有它,所以让我们停止使用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'
Run Code Online (Sandbox Code Playgroud)
是对的吗?实际上,我不知道!毕竟,这是你的桌子.这是思考的过程,可以让你找到答案,如果你遵循它并检查我的代码,以确保它做我认为它做的,你会做得很好.
或者,当然,你可以随便让网上的人随便为你做功课.他们没有更好的事情要做.
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |