我有一个名为表名的学生姓名列表,我想从另一个名为“类别”的表中找到他们的类别,如下所示:
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
答案 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
)来解决此问题,但这可能会产生效率低得多的执行计划。