【问题标题】:Multiple results on outer query of correlated subquery相关子查询的外部查询的多个结果
【发布时间】:2020-05-18 12:50:06
【问题描述】:

我想知道是否可以让内部查询返回多个结果,然后由外部查询查询?

这是一个可重现的例子:

在此示例中,我想知道每个部门中薪水最高的员工的姓名和薪水。

CREATE TABLE Worker (
    WORKER_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    FIRST_NAME CHAR(25),
    LAST_NAME CHAR(25),
    SALARY INT(15),
    JOINING_DATE DATETIME,
    DEPARTMENT CHAR(25)
);

INSERT INTO Worker 
    (WORKER_ID, FIRST_NAME, LAST_NAME, SALARY, JOINING_DATE, DEPARTMENT) VALUES
        (001, 'Monika', 'Arora', 100000, '14-02-20 09.00.00', 'HR'),
        (002, 'Niharika', 'Verma', 80000, '14-06-11 09.00.00', 'Admin'),
        (003, 'Vishal', 'Singhal', 300000, '14-02-20 09.00.00', 'HR'),
        (004, 'Amitabh', 'Singh', 500000, '14-02-20 09.00.00', 'Admin'),
        (005, 'Vivek', 'Bhati', 500000, '14-06-11 09.00.00', 'Admin'),
        (006, 'Vipul', 'Diwan', 200000, '14-06-11 09.00.00', 'Account'),
        (007, 'Satish', 'Kumar', 75000, '14-01-20 09.00.00', 'Account'),
        (008, 'Geetika', 'Chauhan', 90000, '14-04-11 09.00.00', 'Admin');


找到每个部门的最高薪水很容易:

SELECT MAX(SALARY), DEPARTMENT
FROM Worker
GROUP BY DEPARTMENT;

但是如何将获得这些薪水的员工的姓名也添加到结果中?

非常感谢!

【问题讨论】:

  • 你应该在表中存储部门ID,部门表的外键。
  • 为什么在标题中特别提到了相关子查询?
  • @GordonLinoff 这不是这个吗?如果没有,很高兴改变它。
  • @jarlh 好的,所以这将是表设置的问题(我自己没有这样做),而不是我不正确地查询数据的问题?
  • @seabass20 。 . .有很多方法可以解决这个问题。相关子查询只是一种解决方案。

标签: mysql sql subquery correlated-subquery


【解决方案1】:

您可以将查询与运算符IN 一起使用:

SELECT * FROM Worker
WHERE (DEPARTMENT, SALARY) IN (
  SELECT DEPARTMENT, MAX(SALARY) 
  FROM Worker
  GROUP BY DEPARTMENT 
);

或者如果你使用的是带有RANK()窗口函数的MySql 8.0+:

SELECT w.* 
FROM (
  SELECT *, RANK() OVER (PARTITION BY DEPARTMENT ORDER BY SALARY DESC) rnk
  FROM Worker
) w
WHERE w.rnk = 1

请参阅demo
结果:

> WORKER_ID | FIRST_NAME | LAST_NAME | SALARY | JOINING_DATE        | DEPARTMENT
> --------: | :--------- | :-------- | -----: | :------------------ | :---------
>         3 | Vishal     | Singhal   | 300000 | 2014-02-20 09:00:00 | HR        
>         4 | Amitabh    | Singh     | 500000 | 2014-02-20 09:00:00 | Admin     
>         5 | Vivek      | Bhati     | 500000 | 2014-06-11 09:00:00 | Admin     
>         6 | Vipul      | Diwan     | 200000 | 2014-06-11 09:00:00 | Account   

【讨论】:

  • 嗨@forpas。我认为 MySQL 8.0 版本是我正在寻找的,但另一个答案不太有效(我认为)。在第一个答案中,一个部门的员工(假设她是该部门中薪酬第二高的员工)不可能与另一个部门的薪酬最高的员工拥有相同的薪水。在那种情况下,她还是会出现的,对吧?
  • 两个答案都很好。您的问题的答案是否定的,因为比较 DEPARTMENT 和 SALARY。因此,她是她部门中薪酬第二高的员工,比较将返回 FALSE,因为 DEPARTMENT 或 SALARY 不匹配。当然,窗口函数提供更好的性能,如果您的 MySql 版本是 8.0+,您应该使用第二个查询。
  • 太棒了。我最初将其作为我的解决方案,但没有意识到它会那样工作。感谢您的帮助!
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多