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