SQL从同一个表中的另一行检索列

时间:2018-02-08 21:24:10

标签: sql

我正在尝试构建一个查询,该查询将从一个表中检索员工信息,该表还包含一个名为" REPORTS_TO"的列。这是另一个名为POSITION_NBR的字段的值(基本上是员工和经理都在同一个表中)所以我想检索一行员工数据,然后在该行的其中一列中拉入他们的经理'在同一个表的另一行中引用的名称。

作为一个例子,员工约翰史密斯有一行" POSITION_NBR"等于' 1234'还有专栏" REPORTS_TO"等于" 5678"在另一排,他的经纪人Susie Snowflake在" POSITION_NBR"等于" 5678" (与" REPORTS_TO"在另一行中的值相同)。许多员工可以共享同一位经理,经理也有经理。

这是一个简单的查询,我在同一个表上使用不同的别名进行LEFT OUTER JOIN。我收到了不一致的数据,这是我正在使用的查询:

SELECT 
 A.COMPANY,
 A.DEPTID,
 A.DEPTNAME, 
 A.LOCATION, 
 A.NAME, 
 A.EMPLID, 
 A.REG_TEMP, 
 A.FULL_PART_TIME, 
 A.JOBCODE, 
 A.JOBTITLE, 
 A.SERVICE_DT, 
 A.TERMINATION_DT, 
 A.POSITION_NBR, 
 A.EMPL_STATUS, 
 A.REPORTS_TO,
 AA.NAME AS MANAGER_NAME
FROM PS_EMPLOYEES A
 LEFT OUTER JOIN PS_EMPLOYEES AA ON AA.POSITION_NBR = A.REPORTS_TO 
--AND AA.EMPLID = A.EMPLID 

如果我在最后一行删除未注释的代码(使其处于活动状态),我会得到正确的行数,但是最后一列(AA.NAME AS MANAGER NAME)在每一行都有所有NULL值(应该没有任何空值,因为所有员工都有经理分配)。如果我将此行注释掉(如下所示),那么我的结果中会增加大约2,700行(员工与不同的经理名称重复)

感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:1)

您的查询格式 - 没有评论部分 - 是正确的,我相信@Gordon_Linoff是正确的,因为存在重复的POSITION_NBR值,这就是您获得额外行的原因。

添加AND AA.EMPLID = A.EMPLID条件是没有意义的,因为这会将每个员工加入自己,所以你得到经理的NULLS,除非他们是他们自己的经理!

答案 1 :(得分:0)

您的描述会让我怀疑position_nbr是重复的。你能试试吗?

select position_nbr, count(*) as cnt
from ps_employees
group by position_nbr
having count(*) > 1;

答案 2 :(得分:0)

你必须在同一张桌子上离开联盟。

SELECT
 A.NAME
 A.POSITION_NBR
 A.REPORTS_TO
 B.NAME as 'MANAGER'
FROM
 PS_EMPLOYEES A
LEFT JOIN (SELECT NAME, POSITION_NBR FROM PS_EMPLOYEES) B ON B.POSITION_NBR = A.REPORTS_TO