SQL加入DISTINCT

时间:2015-06-30 12:45:56

标签: sql join

我正在尝试进行查询以加入表格,如下所示我希望将表2中的HighestQual和QualSubject加入表1中的所有列,其中表1 Status ='FINAL'但是通过基于的JOIN加入我正在获取重复的行,因为表2中有2行具有相同的EmpID。

如何只用一行才能返回此内容?任何帮助都会很棒 - 我已尝试过所有连接(我认为)和Distinct,但我不确定如何通过复制特定应用程序(AppID)的行来实现它,因为用户可以拥有2个应用程序(AppID)同时需要同时展示这两者。

    TABLE 1                               TABLE 2  
----------------------               ------------------
EmpID |AppID |AppName |Status        EmpID | HighestQual | QualSubject
----- |----- |--------|------        ----- |------------ |-------------
001   | 001  | A NAME | FINAL        001   | Bsc         | A Subject
001   | 002  | A NAME | FINAL        002   | BA          | B Subject
002   | 003  | B NAME | FINAL        001   | MSc         | C Subject

我想要实现的是

EmpID | AppID | AppName | Status | HighestQual | QualSubject
------------------------------------------------------------
001   | 001   | A NAME  | FINAL  | MSc         | C Subject
001   | 002   | A NAME  | FINAL  | MSc         | C Subject
002   | 003   | B NAME  | FINAL  | BA          | B Subject

但我继续得到AppID的副本,因为连接包括表2中的两行。

正确方向的任何帮助或观点都会很棒。

由于

1 个答案:

答案 0 :(得分:1)

要根据您提供的示例数据获得所需的输出,可以使用以下内容(MySql和SQL-server):

SELECT t1.EmpID, t1.AppID, t1.AppName, t1.Status, MAX(t2.HighestQual), MAX(t2.QualSubject)
FROM Table1 t1 
INNER JOIN Table2 t2 ON t1.EmpID = t2.EmpID 
WHERE t1.Status = 'FINAL'
GROUP BY t1.EmpID, t1.AppID, t1.AppName, t1.Status

但这不是真正的排名,因为它只对{em> Highestqual 和 QualSubject 使用MAX()。这意味着将在 Bsc 之前选择 MSc ,并且 A subject 之前将选择 C subject

可以使用更好的排名字段或子选择,或某些case statementspartition等来改进和扩展此功能。

如果您正在使用SQL-server(2008或更高版本),以下示例也将使用NTILE()生成相同的结果:

SELECT t1.EmpID, t1.AppID, t1.AppName, t1.Status, t2.HighestQual, t2.QualSubject
FROM Table1 t1  
INNER JOIN (
  SELECT EmpID, HighestQual, QualSubject, 
  NTILE(2) over(partition by EmpID order by HighestQual desc) As Rank
  FROM Table2
) t2 ON t2.EmpID = t1.EmpID
WHERE t1.Status = 'FINAL' AND t2.Rank = 1

这可能会被浓缩为不使用子选择,但是现在我无法想到如何。还有许多其他选项,就像SQL一样。