【354天】我愛刷題系列113(2018.01.25)

叨叨兩句

  1. ~

SQL習題008

1

獲取全部員工當前的manager,若是當前的manager是本身的話結果不顯示,當前表示to_date='9999-01-01'。
結果第一列給出當前員工的emp_no,第二列給出其manager對應的manager_no。
CREATE TABLE dept_emp (
emp_no int(11) NOT NULL,
dept_no char(4) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));
CREATE TABLE dept_manager (
dept_no char(4) NOT NULL,
emp_no int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));mysql

本題應注意如下三點:
一、用INNER JOIN鏈接兩張表,由於要輸出本身的經理,得知本身與經理的部門要相同,故有限制條件 de.dept_no = dm.dept_no
二、再用WHERE限制當前員工與當前經理的條件,即 dm.to_date 等於 '9999-01-01' 、de.to_date 等於 '9999-01-01' 、 de.emp_no 不等於dm.emp_no
三、爲了加強代碼可讀性,將dept_emp用別名de代替,dept_manager用dm代替,最後根據題意將de.emp_no用別名manager_no代替後輸出

SELECT de.emp_no, dm.emp_no AS manager_no 
FROM dept_emp AS de INNER JOIN dept_manager AS dm
ON de.dept_no = dm.dept_no 
WHERE dm.to_date = '9999-01-01' AND de.to_date = '9999-01-01' AND de.emp_no <> dm.emp_no

2

獲取全部部門中當前員工薪水最高的相關信息,給出dept_no, emp_no以及其對應的salary
CREATE TABLE dept_emp (
emp_no int(11) NOT NULL,
dept_no char(4) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));
CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));sql

【注意】mysql這樣查不行


此題思路以下:
一、先用INNER JOIN鏈接兩張表,限制條件是兩張表的emp_no相同,即d.emp_no = s.emp_no;
二、選取每一個員工當前的工資水平,用d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'做條件限制,由於此表中每條最新記錄的 to_date 都用 9999-01-01 表示;
三、用GROUP BY d.dept_no將每一個部門分爲一組,用MAX()函數選取每組中工資最高者;
四、將salaries用s代替,dept_emp用d代替,最後將MAX(s.salary)用salary代替後輸出。

SELECT d.dept_no, s.emp_no, MAX(s.salary) AS salary
FROM salaries AS s INNER JOIN dept_emp As d
ON d.emp_no = s.emp_no 
WHERE d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'
GROUP BY d.dept_no
------------------------------------------分割線:若存在多條最大記錄----------------------------------------
有同窗提出疑問,若是存在多條最大記錄怎麼辦?而 MAX 函數根據不一樣數據庫只選擇最前一條或最後一條最大記錄,其他記錄均被忽略。此時解法以下:
一、建立兩張表,一張爲maxsalary,用於存放當前每一個部門薪水的最大值;另外一張爲currentsalary,用於存放當前每一個部門全部員工的編號和薪水;
二、限定條件爲兩張表的 dept_no 和 salary 相等,這樣就能夠找出當前每一個部門全部薪水等於最大值的員工的相關信息了;
三、最後記得根據 currentsalary.dept_no 升序排列,輸出與參考答案相同的記錄表。
四、如下代碼雖然很長,仔細一看都是基於上面的基礎解法變化而來的,中心思想就是繞開 MAX 的特性限制,運用比較的方法選出多個相同的最大值。
 
SELECT currentsalary.dept_no, currentsalary.emp_no, currentsalary.salary AS salary
FROM 
//建立maxsalary表用於存放當前每一個部門薪水的最大值
(SELECT d.dept_no, MAX(s.salary) AS salary
FROM salaries AS s INNER JOIN dept_emp As d
ON d.emp_no = s.emp_no 
WHERE d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'
GROUP BY d.dept_no) AS maxsalary, 
//建立currentsalary表用於存放當前每一個部門全部員工的編號和薪水
(SELECT d.dept_no, s.emp_no, s.salary 
FROM salaries AS s INNER JOIN dept_emp As d
ON d.emp_no = s.emp_no 
WHERE d.to_date = '9999-01-01' AND s.to_date = '9999-01-01'
) AS currentsalary
//限定條件爲兩表的dept_no和salary均相等
WHERE currentsalary.dept_no = maxsalary.dept_no
AND currentsalary.salary = maxsalary.salary
//最後以currentsalary.dept_no排序輸出符合要求的記錄表
ORDER BY currentsalary.dept_no
相關文章
相關標籤/搜索