相关子查询的外部查询的多个结果
Multiple results on outer query of correlated subquery
我想知道是否可以让内部查询 return 多个结果然后由外部查询查询?
这是一个可重现的例子:
在这个例子中,我想知道每个部门薪酬最高的员工的姓名和薪水。
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;
但是我如何将赚取这些薪水的员工的姓名也添加到结果中?
非常感谢!
您可以将查询与运算符 IN
:
结合使用
SELECT * FROM Worker
WHERE (DEPARTMENT, SALARY) IN (
SELECT DEPARTMENT, MAX(SALARY)
FROM Worker
GROUP BY DEPARTMENT
);
或者如果您使用 MySql 8.0+ 和 RANK()
window 功能:
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
我想知道是否可以让内部查询 return 多个结果然后由外部查询查询?
这是一个可重现的例子:
在这个例子中,我想知道每个部门薪酬最高的员工的姓名和薪水。
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;
但是我如何将赚取这些薪水的员工的姓名也添加到结果中?
非常感谢!
您可以将查询与运算符 IN
:
SELECT * FROM Worker
WHERE (DEPARTMENT, SALARY) IN (
SELECT DEPARTMENT, MAX(SALARY)
FROM Worker
GROUP BY DEPARTMENT
);
或者如果您使用 MySql 8.0+ 和 RANK()
window 功能:
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