sql-запрос для выбора данных из таблицы со сложной структурой
У меня есть таблица с нижеприведенной структурой.
Я не контролирую изменение таблицы.
Он имеет три столбца: student_name, student_id, name_id
Теперь имя студента может состоять из любого количества слов. Ровно одно слово придет в один ряд. В зависимости от количества слов, будет введен name_id и повторен student_id.
Структура будет выглядеть примерно так:
Скажи имя 1: Рам Лаксман Прасад Шарма
И имя 2: Пандит Гангадхар Видьядхар Майадхар Омкарнатх Шастри
Таким образом, таблица будет выглядеть следующим образом:
student_name  |   student_id    |   name_id
-------------------------------------------------
 Ram                 1               1
 Laxman              1               2
 Prasad              1               3
 Sharma              1               4
 Pandit              2               1
 Gangadhar           2               2
 Vidyadhar           2               3
 Mayadhar            2               4
 Omkarnath           2               5
 Shastri             2               6
Надеюсь, я ясно объяснил структуру.
Теперь я хочу написать запрос, чтобы прочитать только первые четыре имени на одного студента. Однако, если число имен меньше четырех, пустая строка должна идти, а если больше четырех, то первые четыре должны идти, а остальные просто игнорируются.Мне нужно поместить его только в один запрос select, так как этот запрос будет передан в программе spring batch. Но я не понимаю, как перебирать столбец nameid, чтобы взять первые четыре идентификатора имени для каждого студента.
Как спроектировать этот sql для DB2 database v8??
Спасибо за чтение.
2 ответа:
Улучшенная версия, вдохновленная Amit-если вам нужны все 4 имени в 1 столбце:)
select t1.student_name || coalesce(' ' || t2.student_name, '') || coalesce(' ' || t3.student_name, '') || coalesce(' ' || t4.student_name, '') as "first 4 names" from mytable t1 left join mytable t2 on t1.student_id = t2.student_id and t2.name_id = 2 left join mytable t3 on t1.student_id = t3.student_id and t3.name_id = 3 left join mytable t4 on t1.student_id = t4.student_id and t4.name_id = 4 where t1.name_id = 1
Во-первых, у меня нет DB2, поэтому могут быть некоторые изменения синтаксиса
Попробуйте следующее
select t1.student_id, ifnull(t2.names, ' ') from (select distinct(student_id) as student_id from tab ) as t1 left outer join ( select tab1.student_id, ifnull(concat(tab1.student_name, ' ', tab2.student_name, ' ', tab3.student_name, ' ', tab4.student_name),'') as names from (select * from tab where name_id = '1') tab1 inner join (select * from tab where name_id = '2') tab2 on tab1.student_id = tab2.student_id inner join (select * from tab where name_id = '3') tab3 on tab1.student_id = tab3.student_id inner join (select * from tab where name_id = '4') tab4 on tab1.student_id = tab4.student_id ) as t2 on t1.student_id = t2.student_idЯ работал над предположением, что ваши name_id-это символы. Также имейте в виду, что я написал этот запрос для MySQL и DB2 может иметь другой синтаксис