2017-08-25 70 views
0

有人可以幫助我理解相關查詢。以下是我試圖理解的查詢,但無法從中獲得任何信息。請幫助。謝謝。無法理解相關查詢

--Step 1 
    select e1.Name as 'Employee', e1.Salary 
    from Employee e1 
    where 3 > 
    (
     select count(distinct e2.Salary) 
     from Employee e2 
     where e2.Salary > e1.Salary 
    ) 
    ; 




--Step 2 
SELECT 
    d.Name AS 'Department', e1.Name AS 'Employee', e1.Salary 
FROM 
    Employee e1 
     JOIN 
    Department d ON e1.DepartmentId = d.Id 
WHERE 
    3 > (SELECT 
      COUNT(DISTINCT e2.Salary) 
     FROM 
      Employee e2 
     WHERE 
      e2.Salary > e1.Salary 
       AND e1.DepartmentId = e2.DepartmentId 
     ) 
; 
+0

在第一步,他們希望得到少於3個不同的E1的員工那些有較少的薪水比較E2員工而在2日,他們希望得到同樣爲第哪來部門一樣 – user3712320

+0

好,考慮到第一個查詢,你有一個問題,因爲第一個查詢並沒有真正做到(我認爲)它試圖做的事情 - 我認爲哪一個是返回員工薪水最高的三名員工。 – Strawberry

+0

我也不明白。假設你必須改變別人的工作,那麼從頭開始可能會更好。 –

回答

0

在第一個查詢你正在返回所有e1.Name和e1.Salary如僱員有2個或更少的記錄,他們的工資比E1大。

第二個查詢做同樣的事情,但只有當員工沒有改變部門。

0

一個合法的查詢來查找員工與前3名的薪水可能如下:

SELECT x.* 
    FROM employee x 
HAVING FIND_IN_SET(salary,(SELECT GROUP_CONCAT(DISTINCT salary ORDER BY salary DESC) FROM employee)) <= 3; 

注:此方法可以返回超過300名員工,如果員工共享同樣的薪水

0

讓我們打破他們下來:

第1步 - 返回所有在前2名工資(3> x)工資的僱員。

  • (SELECT)返回所有員工的名字和他們的工資
  • (FROM)的職員表
  • (WHERE)排除沒有薪水的前2誰員工的子查詢只計算工資數量大於當前評估記錄。如果這個數字超過2,那麼這個人在前3名沒有工資。3> 4 = 3> 3將被拒絕,記錄被排除。

SELECT e1.Name as 'Employee', e1.Salary 
FROM Employee e1 
WHERE 3 > (SELECT count(distinct e2.Salary) 
      FROM Employee e2 
      WHERE e2.Salary > e1.Salary); 

另一種方式來寫這個查詢將

SELECT * 
FROM Employee E1 
WHERE EXISTS (SELECT * 
       FROM Employee E2 
       WHERE E1.Salary = E2.Salary 
       ORDER By salary Desc 
       LIMIT 2) 

以上基本上說返回頂部2薪水和誰擁有那些薪水的一個員工。

步驟2與步驟1相似;但由於相關性也在部門中,因此結果不同。對於每個員工來說,它確定薪水是否是該部門的前兩名之一。如果是包含的記錄。這意味着頂部2薪金由部門,而不是公司的評估寬像步驟1

第2步也可以但是重新編寫,

在除了MySQL的語言中,這可以表示爲:

  1. 使用窗口/分析函數Dense_rank()和按部門劃分;然後將記錄限制爲排名不超過2的人
  2. 使用交叉申請和按薪水desc排序的前2名。
  3. mySQL列出的方法是使用用戶變量的最簡單的方法。以模擬窗口功能或交叉應用上面。