У меня есть особенно сложный запрос для отчета. Он выбирает несколько столбцов из представления, и он должен построить столбец путем агрегированного объединения нескольких полей. Чтобы еще больше усложнить ситуацию, объединение должно содержать 3 поля, даже если в действительности их 0 (объединение разделено запятыми, поэтому пустые поля все равно будут замечены).
Мы используем Oracle 11.1.0.7.0.
Чтобы обеспечить обратную совместимость (необязательно), мы использовали функцию xmlagg для выполнения конкатенации, я полагаю, что она существует с Oracle 8 или 9.
Этот пример будет упрощен, но я считаю, что предоставляет достаточно информации. Другими словами, пожалуйста, не сосредотачивайтесь на нормализации структуры таблицы, это строго пример.
person_view
-----------
name
phone
address
position_id
position_table
--------------
position_id
position_title
Итак, запрос, который у нас сейчас есть, и я признаю, что не являюсь гуру SQL, выглядит примерно так:
select
name,
phone,
address,
(select
xmlagg(xmlelement(e, position_title || ',')).extract('//text()')
from
(select
position_title
from
position_table
where
position_table.position_id = person_view.position_id and
rownum <= 3
union all select '' from dual
union all select '' from dual
union all select '' from dual
)
where
rownum <= 3
)
from
person_view
Моя фактическая ошибка это, кажется, подзапрос, который гарантирует, что по крайней мере 3 строки ввода не могут ссылаться на запрос бабушки и дедушки для определения person_view.position_id.
Я получаю ORA-00904: "PERSON_VIEW". "POSITION_ID": недопустимый идентификатор
Производительность не является большой проблемой, поскольку это отчет, который не будет запускаться регулярно, но мне нужно найти решение для агрегирования этих данных с абсолютными 3 столбцами данных. Мы очень ценим любые рекомендации, которые помогут переписать запрос или разрешить подзапросу доступ к соответствующему столбцу прародителя.