我正在尝试构建一个查询,该查询将从一个表中检索员工信息,该表还包含一个名为" 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行(员工与不同的经理名称重复)
感谢任何帮助,谢谢!
答案 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