PostgreSQL将表联接到几列

时间:2018-09-11 08:15:38

标签: sql postgresql join left-join

我有一个名为表名的学生姓名列表,我想从另一个名为“类别”的表中找到他们的类别,如下所示:

Class_A    Class_B    Class_C  Class_D  Category
Sam                   Adam              High
            Sarah                       Medium
James                                   High
Emma        Simon               Nick    Low

我的解决方案是进行左联接,但第一个表中的学生姓名应与四列之一匹配,因此我不确定如何编写查询。目前,我的查询仅与Class_A匹配,而我需要检查所有类别,如果学生的姓名存在,则返回类别。 (注意:有些行的名称不止一个)

SELECT Names.name, Categories.Category 
FROM Names
   LEFT JOIN Categories ON Names.name = Categories.Class_A; 

表名看起来像这样:

Name
----
Emma
Nick
James
Adam
Jack
Sarah

我期望输出如下:

Name     Category
----     ----
Emma     Low
Nick     Low
James    High
Adam     High
Jack     -
Sarah    Medium

2 个答案:

答案 0 :(得分:1)

在on子句中使用OR进行尝试:

SELECT Names.name, coalesce(Categories.Category,'-') as category 
FROM Names
   LEFT JOIN Categories ON Names.name = Categories.Class_A or Names.name = Categories.Class_B or Names.name = Categories.Class_C or Names.name = Categories.Class_D

答案 1 :(得分:1)

我倾向于取消第一个桌子的位置。看起来像:

select n.name, c.category
from name n left join
     (categories c cross join lateral
      (values (c.class_a), (c.class_b), (c.class_c), (c.class_d)
      ) v(name)
     )
     on n.name = v.name
where v.name is not null;

尽管您也可以在in子句中使用or(或on)来解决此问题,但这可能会产生效率低得多的执行计划。