我有以下查询,由于以下部分:
**LEFT JOIN dbo.Employee Mgr ON
(Pos.PPOSRP = Mgr.APOSNO AND Mgr.AACCT = Emp.AACCT)**
正在返回多条记录。虽然它是有效数据,但我只需要通过此连接返回一条记录。我怎么能相应改变呢?
FROM dbo.Employee as Emp
LEFT JOIN dbo.Position Pos ON Emp.APOSNO = Pos.PPOSNO
LEFT JOIN dbo.Location Loc ON Emp.ALOCN = Loc.LCODE
**LEFT JOIN dbo.Employee Mgr ON
(Pos.PPOSRP = Mgr.APOSNO AND Mgr.AACCT = Emp.AACCT)**
where Emp.AEMPNO = '004635'
ORDER BY Emp.AEMPNO
答案 0 :(得分:0)
您正在加入Employee表,以获取员工的经理或负责人的数据。如果条件:
Pos.PPOSRP = Mgr.APOSNO AND Mgr.AACCT = Emp.AACCT
...选择两行,然后你应该验证它为什么这样做。显然不足以在该表上仅隔离一行。您可能必须在AND中添加一些其他条件以选择所需的条件。也许这个职位在不同的时间被两个不同的人所覆盖,那么你可能需要添加一些条件来选择一个感兴趣的SELECT语句的时间框架。
作为旁注,我想知道为什么当你说你期望在结果集中只有一行时,你正在对AEMPNO进行排序。
答案 1 :(得分:0)
虽然您有多种选择,但您可以这样做:
FROM dbo.Employee as Emp
LEFT JOIN dbo.Position Pos ON Emp.APOSNO = Pos.PPOSNO
LEFT JOIN dbo.Location Loc ON Emp.ALOCN = Loc.LCODE
OUTER APPLY
(SELECT TOP 1 * FROM dbo.Employee Mgr
WHERE Mgr.APOSNO = Pos.PPOSRP AND Emp.AACCT = Mgr.AACCT) Mgr
where Emp.AEMPNO = '004635'
ORDER BY Emp.AEMPNO
如果你想返回仅按某种方式排序的第一行,你可以像往常一样在OUTER APPLY中插入ORDER BY。