如何在具有相似列的 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。
其他选项:
不得不从等级开始限制了一些最明显的选择,但我仍然可以想到两个:
- 使用右连接加入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
- 使用年级和讲师的完整连接 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相同的结果。
我有一个主要 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。
其他选项:
不得不从等级开始限制了一些最明显的选择,但我仍然可以想到两个:
- 使用右连接加入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
- 使用年级和讲师的完整连接 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相同的结果。