Исходная ошибка ORA-00909 исходит от concat()
, которая принимает только два аргумента; у вас есть три:
concat(hd.MAIN_NO, '.', ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO))
Вам нужны вложенные вызовы:
concat(concat(hd.MAIN_NO, '.'), ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO)))
или используйте оператор ||
:
hd.MAIN_NO || '.' || ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO)
Как отмечено в комментариях, у вас есть другие проблемы; Исправление проблемы concat
позволяет вместо этого появиться сообщение об ошибке «ORA-01789: блок запросов содержит неверное количество столбцов результатов». (Как и в вашем измененном вопросе.) Вы можете исправить это с помощью нулей, также предложенных в комментариях; но ваши rnk
столбцы также различаются по типу - первая ветвь использует число из таблицы, вторая - строку - что получит «ORA-01790: выражение должно иметь тот же тип данных, что и соответствующее выражение».
Я думаю, вы хотите просто рассматривать заголовок как ранг 0 в main_no
, что полностью исключает объединение:
SELECT MAIN_NO, MAIN_DESCRIPTION, MAIN_CUST, MAIN_NAME,
PREV_VALUE, NEW_VALUE, REV, STATE, MODIFIED, NOTE
FROM (
SELECT MAIN_NO, MAIN_DESCRIPTION, MAIN_CUST, MAIN_NAME,
null as prev_value, null as new_value, null as rev, null as state,
null as modified, null as note, 0 rnk
FROM HeaderTable
UNION ALL
SELECT hd.MAIN_NO, hd.PERF, hd.EVENT, hd.INFO,
hd.PREV_VALUE, hd.NEW_VALUE, hd.REV, hd.STATE, hd.MODIFIED, hd.NOTE,
ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO) as rnk
FROM HeaderTable h
INNER JOIN DetailTable hd on h.MAIN_NO= hd.MAIN_NO
)
ORDER BY main_no, rnk
/
MAIN_NO MAIN_D MAIN_CU MAIN_ PREV_VALUE NEW_VALUE REV STA MODIFIED NOTE
---------- ------ ------- ----- ---------- ---------- ---------- --- ---------- -----
1 Apple Student John
1 ABC YES RED 12 30 0 Con 01/02/2018 FALSE
1 DEF YES BLUE 18 34 0 Con 01/04/2018 FALSE
2 Pear Child Peter
2 GHI NO BLUE 14 38 0 UUU 01/07/2018 TRUE
2 JKL NO RED 11 39 0 Con 01/03/2018 FALSE
3 Orange Alien Matt
3 MNO NO GREEN 19 32 0 UUU 01/01/2018 TRUE
3 PQR YES WHITE 10 33 0 UUU 01/08/2018 TRUE
Я также удалил некоторые ненужные подзапросы; вам нужно, чтобы rnk
был включен в окончательный набор результатов.
С опозданием заметили, что вы добавите SQL-скрипку для данных; вот результат для этого .
Вы можете явным образом привести нули к ожидаемому типу данных, но в этом нет необходимости; просто для забавы я сделал это в этой демонстрации db <> fiddle , с вашими примерами данных в CTE.