Postgresql объединяет таблицы в несколько столбцов - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть список имен учеников, называемых именами таблиц, и я хочу найти их категории в другой таблице под названием Категории, как показано ниже:

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 голосов
/ 11 сентября 2018

Я был бы склонен разворачивать первую таблицу.Это выглядит так:

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, это может привести к гораздо менее эффективному плану выполнения.

0 голосов
/ 11 сентября 2018

Попробуйте это, используя ИЛИ в предложении:

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
...