2016-09-22 55 views
1

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,因为查询已经是很长)。

回答

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)。然后只选择最高工资大于起始工资的记录。

+0

感谢。我想到了它,但它可以选择工资下降的人。这就是为什么我们也应该检查日期(employees.hire_date,salaries.from_date,salaries.to_date) –

+0

我明白你的观点。检查编辑并让我知道你在想什么 – kbball

+0

我不明白为什么,但MySQL返回一个语法错误:'你的SQL语法有错误;检查与你的MySQL服务器版本相对应的手册,在'开始[...]'附近使用正确的语法 –

0

重制帧您的查询,添加在选择新的列来选择员工的薪资初步

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 ;