2017-03-24 39 views
2

我有兩個表,名爲'表123'和'表246'。SQL中的Equi-Join和Inner-Join之間的區別

'table123' 列: 'ID', 'DEPT_ID', '將First_Name', '', '工資', '地址'。

'table246' 列: 'DEPT_ID', 'DEPT_NAME'。

我想查找每個部門薪水最低的員工名單。我能做到的兩種方法是Equi-JoinInner-Join。我被告知他們都可以用來提供所需的結果。

的查詢我使用:

同等聯接:

SELECT First_Name, b.Dept_Name, alt.Min_Salary AS Min_Salary 
FROM table123 a, table246 b, 
(SELECT Dept_ID, MIN(Salary)Min_Salary 
FROM table123 
GROUP BY Dept_ID)alt 
WHERE a.Dept_ID = b.Dept_ID 
AND a.salary = alt.Min_Salary 
AND a.Dept_ID = alt.Dept_ID; 

內加入:

SELECT MIN(Salary)Min_Salary, Dept_Name 
FROM table123 a, table246 b 
INNER JOIN (SELECT First_Name, MIN(Salary) 
FROM table123 
GROUP BY Dept_ID)alt 
ON b.Dept_ID = alt.Dept_ID; 

同等聯接語句給我所需的表,包含列'First_Name','Dept_Name'&'Min_Salary',與所有相關虛擬數據。

但是,Inner-Join語句不運行,因爲First_Name列需要包含在聚合函數或GROUP BY子句中。這讓我很困惑,因爲我不知道如何去解決它。如何調整Inner-Join查詢,以便提供與Equi-Join查詢相同的結果?

回答

2

試試這個:

SELECT a.First_Name, b.Dept_Name, alt.Min_Salary AS Min_Salary 
FROM table123 a 
INNER JOIN table246 b 
    ON a.Dept_ID = b.Dept_ID 
INNER JOIN (
      SELECT Dept_ID, MIN(Salary) Min_Salary 
      FROM table123 
      GROUP BY Dept_ID 
      ) alt 
    ON b.Dept_ID = alt.Dept_ID 
WHERE a.Salary = alt.Min_Salary; 
+0

我的錯,我沒有正確輸入。查詢運行,但它從一個表中取回所有記錄。我只想要每個Dept_Name的最低工資,所以應該只有6行。 – CrashBandicoot

+0

在我的回答中嘗試新的查詢 – MayowaO

+0

好的,第二個查詢可以正常工作,但不包括薪水最低的員工的First_Name。這是我在開始時遇到的問題。 – CrashBandicoot