这个查询有什么问题,它不起作用

-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)

AHi*_*ins 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
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)

是对的吗?实际上,我不知道!毕竟,这是你的桌子.这是思考的过程,可以让你找到答案,如果你遵循它并检查我的代码,以确保它做我认为它做的,你会做得很好.

或者,当然,你可以随便让网上的人随便为你做功课.他们没有更好的事情要做.