如何在具有相似列的 PostgreSQL 中连接两个表并保留不匹配的字段 NULL 或保持不变

How to join two tables in PostgreSQL with similar columns and leave unmatching fields NULL or untouched

我有一个主要 table 年级。我已经加入了 table 和 Class table。现在我想加入另一个table,导师。

年级

ClassID AverageGrade
1 A
2 B
3 B+

Class

ID Class
1 Math
2 English
3 History
4 Spanish
5 Science

讲师

Class Instructor
1 Alice
2 Bob
4 Charlie

我当前的查询是

select * from Grade left join Class on Grade.ClassID = Class.ID

有什么方法可以让我在此查询之上加入 Instructor,以便我的 table 具有以下内容?

ID Class AverageGrade Instructor
1 Math A Alice
2 English B Bob
3 History B+
4 Spanish Charlie

不包括 5-Science,因为它既没有等级也没有讲师。

由于其他原因,我必须先加入Grade

谢谢!

不,您不能在您的查询之上使用 LEFT JOIN Instructor,因为第一个 table(等级)限制了您在使用左联接时获得的结果记录数量。如果您只剩下 join'ing,则结果中不能有来自 Grade table 的 NULL。

其他选项:

不得不从等级开始限制了一些最明显的选择,但我仍然可以想到两个:

  1. 使用右连接加入class然后加入讲师。这样我需要在 WHERE 部分过滤掉 classes 没有教师和成绩:
select 
  Class.ID,
  Class.Class,
  Grade.AverageGrade,
  Instructor.Instructor
from 
  Grade
  right join Class on Grade.ClassID = Class.ID
  left join Instructor on Class.ID = Instructor.Class
where 
  Grade.AverageGrade is not null
  or instructor.Instructor is not null
  1. 使用年级和讲师的完整连接 returns 我需要的记录,因此以后不需要过滤,但是 class 应该使用来自年级或讲师的 id 作为其中之一进行连接它们可能为 NULL。
select 
  Class.ID,
  Class.Class,
  Grade.AverageGrade,
  Instructor.Instructor
from 
  Grade
  full join Instructor on Grade.ClassID = Instructor.Class
  join Class on coalesce(Grade.ClassID, Instructor.class) = Class.ID

他们都return相同的结果。