Выбор одного столбца N-й строки из ссылочной таблицы в списке выбора - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть две таблицы: cross_section и layer.

У каждого сечения есть несколько слоев, которые в свою очередь имеют позицию и итоговый столбец.Позиции (целые числа) используются для упорядочения слоев каждого поперечного сечения, но не обязательно должны быть последовательными (например, 10, 20, 40).

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

Большая часть SQL генерируется автоматически;Я могу только добавить в список выбора дополнительные элементы, содержащие подзапросы.Вот как выглядит автоматически сгенерированный SQL:

select cs.*, [first layer summary], [second layer summary]... from cross_section cs;

Я пробовал несколько разных подходов, но ни один из них не работал должным образом (возможно, это просто невозможно).

Мой текущий нерабочий статус выглядит следующим образом:

---------------generated------------------------------------------
select cs.*,
---------------partial statment for clumn one---------------------
    (select summary 
    from (select summary, l.cs_id 
         from layer l order by layer_position)
    where cross_section.id like cs_id and rownum=1) layer_summary_1,
---------------partial statment for clumn two---------------------
    (select summary 
    from (select summary, l.cs_id 
         from layer l order by layer_position)
    where cross_section.id like cs_id and rownum=2) layer_summary_2
---------------generated------------------------------------------
from cross_section cs;

В настоящий момент все, кроме первой позиции, возвращается как нулевое значение.

Редактировать: Пример вывода в соответствии с запросом:

CSID,   Stuff from cross section,   layer_summary_1,    layer_summary_2
12345,  ...,                        stuff               (null)

1 Ответ

0 голосов
/ 14 февраля 2019

Проблема в этом пункте: rownum=2.

Псевдостолбец rownum перечисляет строки в сгенерированном наборе результатов.Таким образом, есть rownum = 1, который возвращает одну строку;Вот почему вы обнаружили, что первая позиция возвращается, как и ожидалось.Но никогда не может быть rownum = 2.(rownum <= 2 возвращает две строки, потому что есть строка, где rownum = 1.)

Решение простое: используйте аналитическую функцию row_number() в своих подзапросах, на которую вы можете ссылаться в главном предложении WHERE:

---------------generated------------------------------------------
select cs.*,
---------------partial statment for clumn one---------------------
    (select summary 
    from (select summary, l.cs_id  
                 , row_number() over (order by layer_position) as rn 
         from layer l order by layer_position)
    where cross_section.id like cs_id and rn=2)
---------------partial statment for clumn two---------------------
    (select summary 
    from (select summary, l.cs_id 
                 , row_number() over (order by layer_position) as rn 
         from layer l order by layer_position)
    where cross_section.id like cs_id and rn=2)
---------------generated------------------------------------------
from cross_section cs;

Ваш вопрос не ясен в отношении данных или бизнес-логики, поэтому приведенные выше результаты могут привести к неверным результатам.Если это так, вам нужно настроить условие окна, добавив критерии PARTITION BY.Такие как:

  , row_number() over (partition by cs_id order by layer_position) as rn 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...