2016-09-22 11 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 

最初に従業員1人当たり最大給与(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 ; 
関連する問題