2017-10-04 92 views
0

下面是一個簡單的數據庫模式,根據該模式,我想找到的所有員工中最高的薪水,提出有關該僱員的信息(A_ID,a_name, b_area)。我如何加入使用SQL得到的結果4桌

只會有一個從表d結果回報,我嘗試返回employment_id與其他錶鏈接,但隨後返回大於1分的結果。請檢查我的查詢下,非常感謝你:) enter image description here

SELECT 
    a.a_id, 
    a.a_name, 
    b.b_area 
FROM 
    A a, B b, C c 
LEFT JOIN (SELECT d.employee_id, MAX(d.salary) FROM D d) 
    ON d.employee_id= c.employee_id; 

回答

0

,錯過你的表連接條件。這應該做你需要的。

SELECT a.a_id, a.a_name, b.b_area 
FROM C 
JOIN A ON a.a_id = c.a_id 
JOIN B ON b.b_id = c.c_id 
JOIN D ON d.employee_id = c.employee_id  
WHERE d.salary = (SELECT max(salary) FROM D) 
+0

如果我添加到最高的薪水的條件,這將是'd.salary =(SELECT MAX(工資)FROM d其中XXX YYY =);'? @Radim巴卡 –

0

有幾種方法:

子選擇的解決方案:

SELECT A.a_name 
     ,B.b_area 
     ,maxsalary.MaxSal 
    FROM 
     (
     SELECT D.employee_id 
       ,MAX(D.Salary) as MaxSal 
      FROM D 
     GROUP BY D.employee 
    ) maxsalary 
    INNER JOIN C 
      ON C.employee_id = maxsalary.employee_id 
    INNER JOIN B 
      ON C.b_id = B.b_id 
    INNER JOIN A 
      ON C.a_id = A.a_id 

這種解決方案可能是更好的性能。由於SUBSELECT maxsalary將只返回一行。

1

開始d,再加入如需要其他表:

... D left join c on (d.employee_id = c.employee_id) left join a on ... 

而且薪水最高位會是這樣的:

... where salary = (select max(salary) from d) 

請記住,這將如果返回多個結果有超過一名員工的最高工資。

+0

什麼,如果我想找到最大的工資(這是去年和今年的工資之間的比較:'MAX(L_SALARY - N_SALARY)')? –

+0

您的問題中沒有該模型中的數據,因此很難就此向您提供任何建議。也許這是一個不同的問題? –

+0

實際上模式是一個修改的模式,在表D下,它也有L_SALARY(去年的工資)和N_SALARY(今年工資)的列 –

0

我想你使用HAVING子句,

SELECT a.a_id, a.a_name, b.b_area FROM A a, B b, C c LEFT JOIN D d ON c.employee_id = d.employee_id 
GROUP BY d.salary 
HAVING MAX(d.salary); 
0
SELECT D.*, a.a_name, b.b_area FROM D 
LEFT JOIN c ON d.employee_id = c.employee_id 
LEFT JOIN a ON a.a_id = c.a_id 
LEFT JOIN b ON b.b_id = c.a_id 
ORDER BY D.salary DESC LIMIT 1 

這將輸出一個行爲:
EMPLOYEE_ID |薪水| a_name | b_area

+0

什麼,如果我想找到最大的工資(這是去年和今年的工資之間的比較:MAX(L_SALARY - N_SALARY))? –