【问题标题】:SQL retrieve column from another row in same tableSQL 从同一个表中的另一行检索列
【发布时间】:2018-02-09 05:47:45
【问题描述】:

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

例如,员工 John Smith 有一行“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 行(员工姓名与不同的经理姓名重复)

感谢任何帮助,谢谢!

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 使用左连接而不是左外连接。然后使用 GROUP BY employeeID。我认为这会给你你所需要的。

标签: sql


【解决方案1】:

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

添加AND AA.EMPLID = A.EMPLID 条件是没有意义的,因为这会将每个员工与他们自己联系起来,因此您会为经理获得 NULLS,除非他们是他们自己的经理!

【讨论】:

  • 另外,您肯定要加入 POSITION_NBR 字段而不是 EMPLID 吗?查看查询中的字段,我希望 EMPLID 是识别每个人的关键字段,因此是要加入的人。
【解决方案2】:

你的描述会让我怀疑position_nbr 是重复的。你可以试试这个吗?

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

【讨论】:

  • position_nbr 是“重复的”,因为在某些情况下,员工的经理发生了变化,因此在数据库中添加了一个新行,该行具有该员工的相同职位编号和一个新的经理姓名。我需要修改查询以查看最新的经理(Max),而不是所有的历史经理......
【解决方案3】:

您必须针对同一张表进行左连接。

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

【讨论】:

    猜你喜欢
    • 2016-04-27
    • 2014-08-18
    • 1970-01-01
    • 2011-04-18
    • 2016-12-24
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多