通过条目循环

时间:2014-09-26 18:51:50

标签: sql

我是一名实习生,接管了我公司前任实习生的一个项目,我的数据库经验非常少。项目范围已扩大,我需要从数据库中获取更多数据。我有以下SQL查询:

select
    DSR_SEGMENT_LIGNE.SEG_NOM as "name",
    DSR_NOEUD_SIMUL.NOE_NUMERO_NOEUD as "start",
    DSR_NOEUD_SIMUL_ARRIVEE.NOE_NUMERO_NOEUD as "end",
    DSR_SEGMENT_LIGNE.SEG_CIRCUIT as "circuit",
    case DSR_SEGMENT_LIGNE.SEG_R0_MANUELLE 
        when 0 then DSR_SEGMENT_LIGNE.SEG_R0
        else DSR_SEGMENT_LIGNE.SEG_R0_MANUELLE
    end as "r0",
    case DSR_SEGMENT_LIGNE.SEG_X0_MANUELLE 
        when 0 then DSR_SEGMENT_LIGNE.SEG_X0
        else DSR_SEGMENT_LIGNE.SEG_X0_MANUELLE
    end as "x0",
    case DSR_SEGMENT_LIGNE.SEG_R1_MANUELLE 
        when 0 then DSR_SEGMENT_LIGNE.SEG_R1
        else DSR_SEGMENT_LIGNE.SEG_R1_MANUELLE
    end as "r1",
    case DSR_SEGMENT_LIGNE.SEG_X1_MANUELLE 
        when 0 then DSR_SEGMENT_LIGNE.SEG_X1
        else DSR_SEGMENT_LIGNE.SEG_X1_MANUELLE
    end as "x1",
    sum(DSR_SECTION_LIGNE.SEC_LONGUEUR) as "length",
    DSR_SEGMENT_LIGNE.SEG_PARALLELE as "parallel",

from
    DSR_SEGMENT_LIGNE
    inner join DSR_NOEUD_SIMUL
        on DSR_SEGMENT_LIGNE.SEG_ID_NOEUD_DEPART
            = DSR_NOEUD_SIMUL.NOE_ID_NOEUD
    inner join DSR_NOEUD_SIMUL DSR_NOEUD_SIMUL_ARRIVEE
        on DSR_SEGMENT_LIGNE.SEG_ID_NOEUD_ARRIVEE
            = DSR_NOEUD_SIMUL_ARRIVEE.NOE_ID_NOEUD
    inner join DSR_LIGNE
        on DSR_LIGNE.LIG_ID_LIGNE
            = DSR_SEGMENT_LIGNE.LIG_ID_LIGNE
    inner join DSR_SECTION_LIGNE
        on DSR_SEGMENT_LIGNE.SEG_ID_SEGMENT
            = DSR_SECTION_LIGNE.SEG_ID_SEGMENT

where DSR_LIGNE.LIG_NOM = "3040"
group by
    DSR_SECTION_LIGNE.SEG_ID_SEGMENT
order by
    1, 2

哪个输出:

name    start   end circuit r0                  x0                  r1                  x1                  length              parallel    
A       1370    1382    1   0,0005425630938234  0,00167906265425173 7,3195053173195E-5  0,00055148562601198 0,177540954416641   0   
B       1382    1383    1   0,0126386706603645  0,0378025148848846  0,00563519872024541 0,0131910224409082  3,70050627461981    1   
C       1382    1383    2   0,0126386706603645  0,0378025148848846  0,00563519872024541 0,0131910224409082  3,70050627461981    1   
D       1383    5515    1   0,021837386745766   0,0747186186014143  0,00948008366199402 0,023230913897742   6,82876115295014    0   

从其他表中收集其他数据所需的相关元素是“名称”(在这种情况下,四个名称是A,B,C和D,并且始终是唯一的)。是否有可能以某种方式遍历这四行(例如:for each "name" do ...)而无需手动命名名称(例如where name = "A")并为每个名称收集特定于名称的数据并将该数据放入该名称中行?

1 个答案:

答案 0 :(得分:3)

你没有一般使用sql“循环遍历行”,所以你需要以不同的方式思考这个问题。

听起来您希望其他表在名称上加入此查询。

要做到这一点,只需添加更多联接,如:

inner join SOME_OTHER_TABLE 
    on SOME_OTHER_TABLE.SOME_COL = DSR_SEGMENT_LIGNE.SEG_NOM 

然后只需将您想要的其他表中的其他列添加到您的选择中。

我在这里做了一些简化的假设(原始查询和你要加入的其他表的行之间有1:1的对应关系)。这可能有效,也可能无效,具体取决于实际关系是什么,以及您尝试从其他表中获取的数据。