我正在尝试进行查询以加入表格,如下所示我希望将表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中的两行。
正确方向的任何帮助或观点都会很棒。
由于
答案 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 statements
或partition
等来改进和扩展此功能。
如果您正在使用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一样。