2

私のSQLは以下のような値を返します。

enter code here

studentid   studentname   playid     gamename        grade        prizes   
---------  ------------   -----      ------------    ------      ---------   
121   bob                1          game1           A           1 and 2  
121   bob                2          game2           C           1 and 3  
121   bob                3          game3           B           4 and 2    
121   bob                4          game4           D           1 and 2  
131   jack               3          gam3            A           1    
131   jack               1          game1           A           2 and 3  

結果を取得し、表示する値を繰り返しますが、最後の列では、値を別の形式で表示する必要があります。

Iterator<Search> iterator = products.iterator();   

while(iterator.hasNext())   
{   
Search req = (Search)iterator.next();   
req.getStudentid();   
req.getStudentname();   
req.getgameid();   
req.getgamename();   
req.getgrade();   
req.getprizes()          ;   
}  

表示形式は…

studentid  studentname    playid    gamename     grade        prizes   
---------- -----------    ------    --------    -------      ---------   
121           bob         1         game1        A           1 and 2 and 3 and 4  
121           bob         2         game2        C           1 and 2 and 3 and 4  
121           bob         3         game3        B           1 and 2 and 3 and 4    
121           bob         4         game4        D           1 and 2 and 3 and 4   
131           jack        3         gam3         A           1 and 2 and 3    
131           jack        1         game1        A           1 and 2 and 3 

最初の行に賞品の4行の値を追加する方法は? ここをループする方法は?私を助けてください。


編集: 私の SQL クエリは次のとおりです。

SELECT stu.studentid, stu.studentname,g.playid,stu.gamename,g.grade,g.prizes
  FROM student stu , game g 
  WHERE stu.studentid = g.studentid AND stu.year = g.year
4

1 に答える 1

1

これは SQL だけを使用して実行できますが、最高のパフォーマンスが得られるかどうかはわかりません。これはおそらく、プレゼンテーション ロジックで処理する必要があります。また、賞品の列を正規化することもお勧めします。これらを 1-n テーブルに格納することを検討してください (GamePrizes など)。

あなたがやろうとしていることがいくつかあります。まず、すべての賞品を 1 つの値に結合します。そのために使えますLISTAGG。ただし、個別のリストは含まれません。したがって、リストを分割するにはCONNECT BY、 andを使用しREGEXP_SUBSTRてリストを分割できます。この場合、区切り文字として " and " を使用しています。最後に、別の賞品のリストをLISTAGGもう一度使用して元に戻すと、次のようになります。

select stu.studentid, stu.studentname, 
  g.playid, g.gamename,g.grade,
  listagg(allprizes, ' and ') within group (order by allprizes) allprizes
from student stu 
  join game g on stu.studentid = g.studentid and stu.year = g.year
  join (
    select distinct studentid, regexp_substr(allprizes,'[^ and ]+', 1, level) allprizes
    from 
    (
      select studentid, listagg(prizes, ' and ') within group (order by prizes) allprizes
      from game
      group by studentid
    ) 
    connect by regexp_substr(allprizes, '[^ and ]+', 1, level) is not null
  ) p on g.studentid=p.studentid
group by stu.studentid, stu.studentname, 
  g.playid, g.gamename,g.grade

その結果:

STUDENTID   STUDENTNAME   PLAYID   GAMENAME   GRADE   ALLPRIZES
-------------------------------------------------------------------------
121         bob          1         game1      A       1 and 2 and 3 and 4
121         bob          2         game2      C       1 and 2 and 3 and 4
121         bob          3         game3      B       1 and 2 and 3 and 4
121         bob          4         game4      D       1 and 2 and 3 and 4
131         jack         1         game1      A       1 and 2 and 3
131         jack         3         game3      A       1 and 2 and 3
于 2013-06-02T05:06:25.427 に答える