2016-09-22 98 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 ;