2016-09-22 2 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을 할 수있는)

작동하지 않습니다.

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) 

편집 :

답변

0

한 가지 방법은 급여에 MAX와 MIN을 사용하는 것입니다 당신이 최대 급여가 실제로 고용 날짜보다 나중에 온 수 있도록하려는 경우, 당신은 이런 식으로 할 수 :

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 서버 버전에 해당하는 설명서를 확인하십시오. 'ON ON [...]' –

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 ;