0

这些是我的桌子。

Step

stepid     name
a           place1
b           place2          
c           place3
d           place4
e           place5
f           place6


Stage

stageid     start        finish
1            a            b
2            b            c
3            c            d
4            d            e
5            e            f

Trip

tripid     stageid       
1            1            
1            2            
1            3            
1            4      
1            5  

我想实现这个查询结果

tripid     stageid       
1          place1,place2,place3,place4,place5,place6        

我知道如何将所有 id 放入一个字段以及如何用分配的名称替换 id。但是我不知道如何加入这两种解决方案。

这是我用来将 id 放入一个字段的 sql。

SELECT REPLACE(stageid,'''') as stages
FROM (SELECT SYS_CONNECT_BY_PATH(stageid,' ') stageid, level 
FROM trip
START WITH stageid = (select min(stageid) from trip)
CONNECT BY PRIOR stageid < stageid
ORDER BY level DESC) 
WHERE rownum = 1; 

start 和 finish 是 stepid 的外键,trip table 的 stageid 是 Stage 表中 stageid 的外键我在 oracle developer ver 3.2 上工作。你能帮忙吗?

4

3 回答 3

1

我认为最简单的方法就是使用listagg()聚合字符串。将表连接在一起,然后聚合它们:

select t.tripid,
       listagg(st.name, ',') within group (order by st.stepid)
from trip t join
     stage s
     on t.stageid = s.stageid join
     step st
     on st.stepid in (s.start, s.finish)
group by t.tripid
于 2013-05-06T18:07:13.407 回答
1

试试这个,记住我重命名startstartid

SELECT tripid, REPLACE(stageid,'''') as stages
FROM (
    SELECT tripid, SYS_CONNECT_BY_PATH(step.name,' ') stageid, level 
    FROM trip
    JOIN stage USING(stageid)
    JOIN step ON stage.startid=step.stepid
    START WITH stageid = (select min(stageid) from trip)
    CONNECT BY PRIOR stageid < stageid
    ORDER BY level DESC
  ) 
WHERE rownum = 1; 

它只输出开始步骤名称而不是 id,如果您想获取行程中的所有地点,只需加入 start 和 end 并使用 distinct 可能会更容易

如果有人有更好的主意,这是一个可以玩的小提琴: http ://sqlfiddle.com/#!4/1d5d5/8

于 2013-05-06T17:11:47.330 回答
1

假设您可以访问LISTAGG,那么这是一个应该非常接近的选项:

SELECT tripid, stages || ',' || step.name
FROM (
  SELECT trip.tripid, 
    LISTAGG(step.name, ',') within group (order by stage.stageid) stages,
    MAX(stage.stageId) maxStageId
  FROM stage
    INNER JOIN step on stage.startstep = step.stepid
    INNER JOIN trip on stage.stageid = trip.stageid
  GROUP BY trip.tripid
) t INNER JOIN stage ON t.maxStageId = stage.stageId
    INNER JOIN step on stage.finishstep = step.stepid

SQL 小提琴演示

基本上它使用 startstep 来构建列表,然后根据 max stage id 连接最后一个 finishstep。

于 2013-05-06T17:13:11.780 回答