Получить данные путем присоединения к таблице не работает в oracle - PullRequest
0 голосов
/ 08 мая 2020

У меня есть 2 таблицы, в которые я хочу присоединиться и получить данные. Например: Таблица A состоит из кода ошибки, а описание ее кода находится в таблице B.

Таким образом, значение кода ошибки сохраняется как ,1, ,2, ,1,2 в таблице A.

tbl_fiber_invalid_trans_data -> Таблица A

TBL_INVALID_ERROR_DATA -> Таблица B.

Я попытался присоединиться, как показано ниже, но все примечания были пустыми

SELECT a.SPAN_ID,MAINTENANCE_ZONE_NAME,a.MAINTENANCE_ZONE_CODE,a.R4G_STATE_NAME,
a.NETWORK_CATEGORY,a.NETWORK_TYPE,a.CONSTRUCTION_METHODOLOGY,
a.INVENTORY_STATUS_CODE,a.OWNERSHIP_TYPE_CODE,a.ROUTE_NAME,a.INTRACITY_LINK_ID ,
a.CALCULATED_LENGTH, REPLACE(a.REMARKS, ',1', '1') as REMARKS
		FROM tbl_fiber_invalid_trans_data a
		left JOIN TBL_INVALID_ERROR_DATA t
   ON a.REMARKS = t.ID;

Дайте мне знать, где я ошибаюсь. и как заменить все эти значения, разделенные запятыми

обновить

Table:tbl_fiber_invalid_trans_data
Name                     Null Type            
------------------------ ---- --------------- 
SPAN_ID                       NVARCHAR2(100)  
MAINTENANCE_ZONE_NAME         NVARCHAR2(100)  
MAINTENANCE_ZONE_CODE         NVARCHAR2(50)   
R4G_STATE_NAME                NVARCHAR2(50)   
STATE_NAME                    NVARCHAR2(50)   
NETWORK_CATEGORY              NVARCHAR2(100)  
NETWORK_TYPE                  NVARCHAR2(100)  
CONSTRUCTION_METHODOLOGY      NVARCHAR2(50)   
INVENTORY_STATUS_CODE         NVARCHAR2(20)   
OWNERSHIP_TYPE_CODE           NVARCHAR2(20)   
ROUTE_NAME                    NVARCHAR2(100)  
INTRACITY_LINK_ID             NVARCHAR2(100)  
CALCULATED_LENGTH             NUMBER(38,8)    
LAST_UPDATED_BY               NVARCHAR2(100)  
LAST_UPDATED_DATE             DATE            
REMARKS                       NVARCHAR2(1000) 


Table:TBL_INVALID_ERROR_DATA

Name     Null Type           
-------- ---- -------------- 
ID            NUMBER(18,8)   
ERR_CODE      NVARCHAR2(500) 

Примеры данных, как показано

Таблица 1

[! [Img1] [1]] [1]

Пример таблицы данных 2

[! [Введите описание изображения здесь] [2]] [2]

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Вот упрощенный пример, который показывает, как вы можете извлечь целые числа из списка, разделенного запятыми (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

1 голос
/ 08 мая 2020

Вам необходимо соединение с LIKE следующим образом:

ON a.REMARKS || ',' like '%,'|| t.ID || ',%';

Обновление

Вы должны использовать следующий запрос:

SELECT SPAN_ID,
       MAINTENANCE_ZONE_NAME,
       MAINTENANCE_ZONE_CODE,
       R4G_STATE_NAME,
       NETWORK_CATEGORY,
       NETWORK_TYPE,
       CONSTRUCTION_METHODOLOGY,
       INVENTORY_STATUS_CODE,
       OWNERSHIP_TYPE_CODE,
       ROUTE_NAME,
       INTRACITY_LINK_ID,
       CALCULATED_LENGTH,
       LISTAGG(ID,',') WITHIN GROUP (ORDER BY ID) AS REMARKS,
       LISTAGG(ERR_CODE,',') WITHIN GROUP (ORDER BY ID) AS ERR_CODE
FROM
(SELECT DISTINCT A.SPAN_ID,
       MAINTENANCE_ZONE_NAME,
       A.MAINTENANCE_ZONE_CODE,
       A.R4G_STATE_NAME,
       A.NETWORK_CATEGORY,
       A.NETWORK_TYPE,
       A.CONSTRUCTION_METHODOLOGY,
       A.INVENTORY_STATUS_CODE,
       A.OWNERSHIP_TYPE_CODE,
       A.ROUTE_NAME,
       A.INTRACITY_LINK_ID,
       A.CALCULATED_LENGTH,
       T.ID,
       T.ERR_CODE
  FROM TBL_FIBER_INVALID_TRANS_DATA A
  LEFT JOIN TBL_INVALID_ERROR_DATA T 
  ON A.REMARKS || ',' LIKE '%,' || T.ID  || ',%')
GROUP BY SPAN_ID,
       MAINTENANCE_ZONE_NAME,
       MAINTENANCE_ZONE_CODE,
       R4G_STATE_NAME,
       NETWORK_CATEGORY,
       NETWORK_TYPE,
       CONSTRUCTION_METHODOLOGY,
       INVENTORY_STATUS_CODE,
       OWNERSHIP_TYPE_CODE,
       ROUTE_NAME,
       INTRACITY_LINK_ID,
       CALCULATED_LENGTH
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...