从嵌套选择

时间:2016-09-22 18:18:43

标签: mysql select join

my database中,我有一个表工资,用于存储员工过去或当前的所有工资,以及存储员工的工作人员。

我正在尝试选择所有获得晋升的员工:

select first_name, last_name 
from salaries 
join employees on employees.emp_no = salaries.emp_no 
where salaries.from_date > employees.hire_date 
  and salary > 
  (select salary from salaries 
   where salaries.emp_no = employees.emp_no and from_date = employees.hire_date) 
group by salaries.emp_no 
limit 10 ;

它返回:

+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Georgi     | Facello   |
| Chirstian  | Koblick   |
| Kyoichi    | Maliniak  |
| Tzvetan    | Zielinski |
| Sumant     | Peac      |
| Mary       | Sluis     |
| Patricio   | Bridgland |
| Eberhardt  | Terkki    |
| Cristinel  | Bouloucos |
| Kazuhide   | Peha      |
+------------+-----------+
10 rows in set (10.05 sec)

现在我试图同时选择他们被雇用时的工资(因为它已经在嵌套选择中被选中)。

有没有办法从select salary from salaries where salaries.emp_no = employees.emp_no and from_date = employees.hire_date获取此数据?

我尝试过像......

select first_name, last_name, first_salary.salary 
from salaries join employees on employees.emp_no = salaries.emp_no 
where salaries.from_date > employees.hire_date and salary > 
  (select salary from salaries where salaries.emp_no = employees.emp_no and from_date = employees.hire_date) 
   AS FIRST_SALARY 
group by salaries.emp_no 
limit 10 ;

......但是它很明确无效

(否则我们可能会执行UNION,因为查询已经非常长)。

2 个答案:

答案 0 :(得分:0)

一种方法是在工资上使用MAX和MIN:

SELECT employees.emp_no, first_name, last_name, MAX(salary), MIN(salary)
FROM salaries 
INNER JOIN employees ON employees.emp_no = salaries.emp_no 
GROUP BY employees.emp_no, first_name, last_name
HAVING MAX(salary) > MIN(salary)

编辑:如果你想确保最高工资实际上是在雇用日期之后的日期,你可以这样做:

SELECT first_name, last_name
FROM 
(SELECT employees.emp_no, first_name, last_name, MAX(salary) AS mxsal
 FROM employees
 INNER JOIN salaries
 ON employees.emp_no = salaries.emp_no
 GROUP BY employees.emp_no, first_name, last_name) highest
INNER JOIN
(SELECT employees.emp_no, salary
 FROM employees
 INNER JOIN salaries on employees.emp_no = salaries.emp_no
 WHERE employees.hire_date = salaries.from_date) starting
ON highest.emp_no = starting.emp_no
WHERE highest.mxsal > starting.salary

首先,我创建了一个“最高”的表,每个员工的最高工资(mxsal)。然后我加入了一个“起始”表,其中包含每个员工的起薪(starting.salary)。然后只选择最高工资大于起始工资的记录。

答案 1 :(得分:0)

重新构建您的查询并在select中添加新列以选择员工的初始薪水

select first_name, 
       last_name ,
       (select top 1 salary 
        from salaries where salaries.emp_no = employees.emp_no 
                                    and from_date = employees.hire_date) AS InitialSalary
from salaries 
join employees on employees.emp_no = salaries.emp_no 
                AND salaries.from_date > employees.hire_date 
                AND salary > (select salary 
                              from salaries 
                              where salaries.emp_no = employees.emp_no 
                                    and from_date = employees.hire_date) 
group by salaries.emp_no 
limit 10 ;
相关问题