用于从具有复杂结构的表中选择数据的SQL查询

时间:2012-03-17 11:37:12

标签: java sql db2

我有一张下面结构的表格。

我无法控制更换桌子。

它有三列:student_name,student_id,name_id

现在学生姓名可以是任意数量的单词。确切地说,一个单词将出现在一行中。根据单词的数量,将输入name_id并重复student_id。

结构可能是这样的:

说name1是:Ram Laxman Prasad Sharma

和name2是:Pandit Gangadhar Vidyadhar Mayadhar Omkarnath Shastri

所以表格如下:

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

我希望我能清楚地解释这个结构。

现在,我想写一个查询,只读取每个学生的前四个名字。但是,如果名称的数量小于4,则应该使用空字符串,如果它大于4,则前四个应该去休息,然后忽略。

我只需将它放在单个选择查询中,因为此查询将在spring批处理程序中传递。但我没有得到如何遍历nameid列以获取每个学生的前四个名称ID。

如何为DB2数据库v8设计此sql ??

感谢阅读。

2 个答案:

答案 0 :(得分:2)

首先,我没有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可能有不同的语法

答案 1 :(得分:2)

受Amit启发的改进版本 - 如果您需要1列中的所有4个名称:)

  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