SQL-запрос для выбора данных из таблицы со сложной структурой - PullRequest
4 голосов
/ 17 марта 2012

У меня есть таблица со структурой ниже.

У меня нет контроля над сменой стола.

В нем есть три столбца: имя студента, идентификатор студента, идентификатор имени

Теперь имя студента может быть любым количеством слов. Ровно одно слово придет в один ряд. В зависимости от количества слов будет введен 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

Надеюсь, я четко объяснил структуру.

Теперь я хочу написать запрос, чтобы прочитать только первые четыре имени на одного учащегося. Однако, если количество имен меньше четырех, пустая строка должна идти, а если ее больше четырех, первые четыре должны идти, а остальные просто игнорируются.

Мне нужно поместить его только в один запрос на выборку, так как этот запрос будет передан в весеннюю пакетную программу. Но я не понимаю, как пройтись по столбцу имен, чтобы взять первые четыре имени для каждого студента.

Как спроектировать этот sql для базы данных DB2 v8 ??

Спасибо за чтение.

Ответы [ 2 ]

2 голосов
/ 17 марта 2012

улучшенная версия, вдохновленная Амитом - если вам нужны все 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
2 голосов
/ 17 марта 2012

Во-первых, у меня нет 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 может иметь другой синтаксис

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...