MySQL如何跨多个表链接单个查询以检索数据?

时间:2014-09-22 20:41:28

标签: mysql

我一直在努力解决这个问题,我不确定如何完成这项任务:“如果他的部门至少有2个年级评论超过1.0的爪牙,那就更新Jarrod的工资。”我们有以下表格:

Table Person {
    Name: Johnathan;  
    SSN: 1234;  


    Name: Robert;  
    SSN: 1324;  


    Name: Jarrod;
    SSN: 4231;

  }

  Table Overlord {

     OverlordID: 1234;
     Salary: 1000;

     OverlordID: 1324;
     Salary: 1330;

     OverlordID: 4231;
     Salary: 1210;

   }

  Table Minion {

    Name: Shemp;  
    SSN: 1264;  
    Yearly Review: 1.2;

    Name: Moe;  
    SSN: 1624;  
    Yearly Review: 0.2;

    Name: Curly;
    SSN: 4261;
    Yearly Review: 1.4;

  }

 Table Dept {

    DeptName: Evil;
    Sector: 1A;
    OverlordID: 1234;

    DeptName: Good;
    Sector: 2B;
    OverlordID: 4231;

  }

  Table Payrolls {

     DeptName: Good;
     Sector: 2B;
     MinionID: 1264;

     DeptName: Good;
     Sector: 2B;
     MinionID: 4261;

     DeptName: Evil;
     Sector: 1A;
     MinionID: 1624;

    }

我为这是一个复杂的数据库结构而道歉,但是使用这样的结构,我需要知道它是如何可能的:

更新Jarrod的工资,如果他的部门至少有2个年级审查超过1.0的爪牙。

1 个答案:

答案 0 :(得分:2)

一种方法是使用子查询,如下所示:

SELECT MinionID FROM Payrolls WHERE DeptName = (
    SELECT DeptName FROM Dept WHERE OverlordID = (
        SELECT SSN FROM Person WHERE Name = "Jarrod"
    )
)

基本上,我们为名为Jarrod的人获取SSN,然后我们获得由该SSN领导的部门名称,然后我们得到以该名称为部门工作的仆从。

这将返回以下数据:

MinionID
---------
1264
4261

然后,您可以将上述查询嵌套在另一个查询中,以将MinionID与Minion表连接:

SELECT * FROM Minion a JOIN (query from above) b ON (a.SSN = b.MinionID)

或者您可以使用IN条件,如下所示:

SELECT * FROM Minion WHERE SSN IN (query from above)

此时我们可以在另一个查询中嵌套,以获得满足YearlyReview>的行数的计数。 1.0:

SELECT COUNT(*) FROM (query from above) c WHERE c.YearlyReview > 1.0;

返回一个包含单行的表:

COUNT(*)
--------
2

现在,您可以在if语句中嵌套 查询,以查看该值是否为> =。

以下是将所有部分放在一起时的样子:

SELECT COUNT(*) FROM (
    SELECT * FROM Minion WHERE SSN IN (
        SELECT MinionID FROM Payrolls WHERE DeptName = (
            SELECT DeptName FROM Dept WHERE OverlordID = (
                SELECT SSN FROM Person WHERE Name = "Jarrod"
            )
        )
    )
) c WHERE c.YearlyReview > 1.0;