Вот упрощенный пример, который показывает, как вы можете извлечь целые числа из списка, разделенного запятыми (REMARKS
в tbl_fiber_invalid_trans_data
), а затем присоединить его к списку кодов ошибок (TBL_INVALID_ERROR_DATA
), чтобы получить сообщения:
WITH codes AS (
SELECT DISTINCT SPAN_ID, REGEXP_SUBSTR(remarks, '\d+', 1, level) AS code
FROM tbl_fiber_invalid_trans_data
CONNECT BY REGEXP_SUBSTR(remarks, '\d+', 1, level) IS NOT NULL
)
SELECT t1.*, t2.err_code
FROM tbl_fiber_invalid_trans_data t1
JOIN codes c ON c.SPAN_ID = t1.SPAN_ID
LEFT JOIN TBL_INVALID_ERROR_DATA t2 ON t2.id = c.code
ORDER BY t1.SPAN_ID
Вывод (для моей упрощенной демонстрации):
SPAN_ID MAINTENANCE_ZONE_NAME REMARKS ERR_CODE
1 Zone 1 ,1 Span id length too short
2 Zone 2 ,2 Inventory suspended
3 Zone 3 ,1,2 Span id length too short
3 Zone 3 ,1,2 Inventory suspended
4 Zone 4 ,2,1 Span id length too short
4 Zone 4 ,2,1 Inventory suspended
5 Zone 5 null null
Если вы хотите, чтобы все ошибки для зоны в одной строке, вы можете объединить их во втором CTE и JOIN
в вместо этого:
WITH codes AS (
SELECT DISTINCT SPAN_ID, REGEXP_SUBSTR(remarks, '\d+', 1, level) AS code
FROM tbl_fiber_invalid_trans_data
CONNECT BY REGEXP_SUBSTR(remarks, '\d+', 1, level) IS NOT NULL
),
msgs AS (
SELECT SPAN_ID, LISTAGG(err_code, ', ') WITHIN GROUP (ORDER BY code) AS err_codes
FROM codes c
LEFT JOIN TBL_INVALID_ERROR_DATA t2 ON t2.id = c.code
GROUP BY SPAN_ID
)
SELECT t1.*, m.err_codes
FROM tbl_fiber_invalid_trans_data t1
JOIN msgs m ON m.SPAN_ID = t1.SPAN_ID
ORDER BY t1.SPAN_ID
Вывод
SPAN_ID MAINTENANCE_ZONE_NAME REMARKS ERR_CODES
1 Zone 1 ,1 Span id length too short
2 Zone 2 ,2 Inventory suspended
3 Zone 3 ,1,2 Span id length too short, Inventory suspended
4 Zone 4 ,2,1 Span id length too short, Inventory suspended
5 Zone 5 null null
Демо на dbfiddle