2014-09-26 3 views
0

Я стажер, занимающийся проектом от предыдущего стажера в моей компании, и у меня очень мало опыта работы с базами данных. Объем проекта расширился, и мне нужно получить больше данных из базы данных. У меня есть следующий 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 

Соответствующий элемент необходим для сбора дополнительных данных из других таблиц «имя» (четыре названия в данном случае являются А , B, C и D и всегда уникальны). Можно ли каким-то образом пропустить эти четыре строки (что-то вроде: for each "name" do ...), не указывая вручную имя (where name = "A") и собирать данные для каждого имени и помещать эти данные в это имя?

ответ

3

Вы не обычно «цикл через строки» с sql, поэтому вам нужно подумать об этом по-другому.

Похоже, вы хотите, чтобы другие таблицы присоединились к этому запросу по имени.

Чтобы сделать это просто добавить больше присоединяется как:

inner join SOME_OTHER_TABLE 
    on SOME_OTHER_TABLE.SOME_COL = DSR_SEGMENT_LIGNE.SEG_NOM 

Тогда просто добавить любые другие столбцы из других таблиц вы хотели в ваш выбор.

Я сделал некоторые упрощающие предположения здесь (между вашим исходным запросом и строками других таблиц, к которым вы будете присоединяться, есть соответствие 1: 1). Это может быть или не быть действительным в зависимости от того, какова фактическая связь и какие данные вы пытаетесь получить из других таблиц.

+0

Поиграв с внутренними соединениями, я думаю, что смогу справиться с этим. SQL-запросы - это совсем другой способ мышления ... Но спасибо! – PhilHQ

Смежные вопросы