使用 SELF(RECURSIVE) JOIN 列出薪水低于或相等于其主管的教职员工

Posted

技术标签:

【中文标题】使用 SELF(RECURSIVE) JOIN 列出薪水低于或相等于其主管的教职员工【英文标题】:List faculty members who have smaller or equal salary than their supervisor by using SELF(RECURSIVE) JOIN 【发布时间】:2017-05-13 07:53:09 【问题描述】:

下面是教师表

这是我的作业中的查询问题,如下所示:

列出薪水低于或相等于其主管的教职员工。列出教师和主管的社会安全号码、姓氏和薪水。 (提示:使用递归连接)

这就是我的方法,如下所示:

SELECT Faculty.FacSSN, Faculty.FacLastName, Faculty.FacSalary, Faculty.FacSupervisor, S.FacLastName, S.FacSalary
FROM Faculty, Faculty S
WHERE NOT Faculty.FacSSN = Faculty.FacSupervisor
AND Faculty.FacSalary <= S.FacSalary
AND NOT Faculty.FacLastName = S.FacLastName
AND Faculty.FacSupervisor IS NOT NULL;

这是我得到的以下结果,如下所示

我得到的结果是主管的薪水大于或等于教员的薪水。但问题是我也得到了教员的薪水(不是主管)大于或等于其他教员的薪水的结果。

我该如何解决这个问题?

有人可以更正我的 SQL 代码吗?

【问题讨论】:

请阅读meta.***.com/questions/285551/… 和接受的答案 我正在使用 Microsoft Access DBMS。 【参考方案1】:

Access 不支持递归连接,您必须为此切换 DBMS。另见Is it possible to create a recursive query in Access?

也就是说,这个问题似乎不需要递归连接,因为只需要直接主管,而不需要整个层次结构。

查看您的查询,我不确定您使用 WHERE NOT Faculty.FacSSN = Faculty.FacSupervisor 的目的是什么(没有人是他们自己的主管),但如果您将其更改为 WHERE S.FacSSN = Faculty.FacSupervisor,它应该可以工作。

清理后的版本如下所示:

SELECT F.FacSSN, F.FacLastName, F.FacSalary, F.FacSupervisor, S.FacLastName, S.FacSalary
FROM Faculty AS F
INNER JOIN Faculty AS S ON S.FacSSN = F.FacSupervisor
WHERE F.FacSalary <= S.FacSalary

【讨论】:

以上是关于使用 SELF(RECURSIVE) JOIN 列出薪水低于或相等于其主管的教职员工的主要内容,如果未能解决你的问题,请参考以下文章

SQL Self Join 比较不同天数的数据

mysql练习----Self join

self join in sql server

Laravel - 使用 Join 语句更新表中的所有列

使用原始表名称为 left_join() 生成的所有列添加前缀

使用列号和行号进行 UNPIVOT 和 JOIN