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

时间:2014-08-14 19:06:07

标签: 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');

3 个答案:

答案 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进行比较。 我们怎么知道呢? (参考你的评论"它应该是什么?)......