2017-03-24 40 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