Вставьте действительные записи из SP в допустимую таблицу и неверные записи в Invalid SP - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть две хранимые процедуры, которые фильтруют записи в таблице и дают результат. Ниже приведены хранимые процедуры.

SELECT distinct  TO_CHAR(sp.RJ_SPAN_ID) AS SPAN_ID
               , TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE
from  APP_FTTX.span@SAT sp
INNER JOIN APP_FTTX.transmedia@SAT tm  -- transmedia added
on sp.RJ_SPAN_ID = tm.RJ_SPAN_ID
WHERE length(sp.RJ_SPAN_ID) = length(tm.RJ_SPAN_ID)
and sp.RJ_MAINTENANCE_ZONE_CODE = tm.RJ_MAINTENANCE_ZONE_CODE
and sp.INVENTORY_STATUS_CODE = tm.INVENTORY_STATUS_CODE
AND LENGTH(sp.RJ_SPAN_ID) = 21
AND (sp.RJ_SPAN_ID LIKE ('%SPN%') 
     OR sp.RJ_SPAN_ID LIKE ('%SPQ%') 
     OR sp.RJ_SPAN_ID LIKE ('%SPR%')    
     OR sp.RJ_SPAN_ID LIKE ('%SPS%'))
AND (sp.RJ_SPAN_ID LIKE ('%_BU') 
     OR sp.RJ_SPAN_ID LIKE ('%_MP'))
AND sp.INVENTORY_STATUS_CODE = 'IPL'
AND sp.RJ_MAINTENANCE_ZONE_CODE = 'INMUNVMB01'
AND (sp.RJ_INTRACITY_LINK_ID NOT LIKE ('%\_9%') ESCAPE '\' 
     OR sp.RJ_INTRACITY_LINK_ID IS NULL);

Вышеуказанный SP возвращает 4 записи, и это действительные записи, которые я хочу вставить в таблицу.

Теперь есть еще один SP, который ниже, который возвращает 7 записей.

SELECT distinct  TO_CHAR(sp.RJ_SPAN_ID) AS SPAN_ID
               , TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE
from  APP_FTTX.span@SAT sp
-- INNER JOIN APP_FTTX.transmedia@SAT tm  -- transmedia added
--  on sp.RJ_SPAN_ID = tm.RJ_SPAN_ID
-- WHERE length(sp.RJ_SPAN_ID) = length(tm.RJ_SPAN_ID)
--  and sp.RJ_MAINTENANCE_ZONE_CODE = tm.RJ_MAINTENANCE_ZONE_CODE
--   and sp.INVENTORY_STATUS_CODE = tm.INVENTORY_STATUS_CODE
WHERE LENGTH(sp.RJ_SPAN_ID) = 21
AND (sp.RJ_SPAN_ID LIKE ('%SPN%') 
     OR sp.RJ_SPAN_ID LIKE ('%SPQ%') 
     OR sp.RJ_SPAN_ID LIKE ('%SPR%')    
     OR sp.RJ_SPAN_ID LIKE ('%SPS%'))
AND (sp.RJ_SPAN_ID LIKE ('%_BU') 
     OR sp.RJ_SPAN_ID LIKE ('%_MP'))
AND sp.INVENTORY_STATUS_CODE = 'IPL'
AND sp.RJ_MAINTENANCE_ZONE_CODE = 'INMUNVMB01'
AND (sp.RJ_INTRACITY_LINK_ID NOT LIKE ('%\_9%') ESCAPE '\' 
     OR sp.RJ_INTRACITY_LINK_ID IS NULL);

SP похожи. Есть 3 записи, которые являются недействительными во втором SP. Итак, я хочу вот что: я хочу вставить другие 3 записи, которые являются недопустимыми, в другую таблицу.

Пожалуйста, предложите, как этого добиться.

ОБНОВЛЕНИЕ

Согласно комментарию Алекса, я получил минус в моем коде ниже.

SELECT distinct  TO_CHAR(sp.RJ_SPAN_ID) AS SPAN_ID, TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE
                                    from  APP_FTTX.span@SAT sp
                                   -- INNER JOIN APP_FTTX.transmedia@SAT tm  -- transmedia added
                                  --  on sp.RJ_SPAN_ID = tm.RJ_SPAN_ID
                                   -- WHERE length(sp.RJ_SPAN_ID) = length(tm.RJ_SPAN_ID)
                                  --  and sp.RJ_MAINTENANCE_ZONE_CODE = tm.RJ_MAINTENANCE_ZONE_CODE
                                 --   and sp.INVENTORY_STATUS_CODE = tm.INVENTORY_STATUS_CODE
                                    WHERE LENGTH(sp.RJ_SPAN_ID) = 21
                                    AND (sp.RJ_SPAN_ID LIKE ('%SPN%') OR sp.RJ_SPAN_ID LIKE ('%SPQ%') OR sp.RJ_SPAN_ID LIKE ('%SPR%')    
                                    OR sp.RJ_SPAN_ID LIKE ('%SPS%'))
                                    AND (sp.RJ_SPAN_ID LIKE ('%_BU') OR sp.RJ_SPAN_ID LIKE ('%_MP'))
                                    AND sp.INVENTORY_STATUS_CODE = 'IPL'
                                    AND sp.RJ_MAINTENANCE_ZONE_CODE = 'INMUNVMB01'
                                    AND (sp.RJ_INTRACITY_LINK_ID NOT LIKE ('%\_9%') ESCAPE '\' OR sp.RJ_INTRACITY_LINK_ID IS NULL)                                        
            MINUS

       SELECT distinct  TO_CHAR(sp.RJ_SPAN_ID) AS SPAN_ID, 
          TO_CHAR(sp.RJ_MAINTENANCE_ZONE_CODE) AS MAINT_ZONE_CODE
                                    from  APP_FTTX.span@SAT sp
                                    INNER JOIN APP_FTTX.transmedia@SAT tm  -- 
                transmedia added
                                     on sp.RJ_SPAN_ID = tm.RJ_SPAN_ID
                                    WHERE length(sp.RJ_SPAN_ID) = 
               length(tm.RJ_SPAN_ID)
                                    and sp.RJ_MAINTENANCE_ZONE_CODE = 
              tm.RJ_MAINTENANCE_ZONE_CODE
                                    and sp.INVENTORY_STATUS_CODE = 
              tm.INVENTORY_STATUS_CODE
                                    AND LENGTH(sp.RJ_SPAN_ID) = 21
                                    AND (sp.RJ_SPAN_ID LIKE ('%SPN%') OR 
                sp.RJ_SPAN_ID LIKE ('%SPQ%') OR sp.RJ_SPAN_ID LIKE ('%SPR%')    
                                        OR sp.RJ_SPAN_ID LIKE ('%SPS%'))
                                    AND (sp.RJ_SPAN_ID LIKE ('%_BU') OR 
               sp.RJ_SPAN_ID LIKE ('%_MP'))
                                    AND sp.INVENTORY_STATUS_CODE = 'IPL'
                                    AND sp.RJ_MAINTENANCE_ZONE_CODE = 
              'INMUNVMB01'
                                    AND (sp.RJ_INTRACITY_LINK_ID NOT LIKE 
               ('%\_9%') ESCAPE '\' OR sp.RJ_INTRACITY_LINK_ID IS NULL);

1 Ответ

1 голос
/ 09 апреля 2020

Я думаю, вам лучше сделать LEFT JOIN.

SELECT DISTINCT sp.RJ_SPAN_ID AS SPAN_ID,
                sp.RJ_MAINTENANCE_ZONE_CODE AS MAINT_ZONE_CODE,
                SYSDATE AS MSG_DATE
FROM   APP_FTTX.span@SAT sp
WHERE  LENGTH(sp.RJ_SPAN_ID) = 21
AND REGEXP_LIKE(sp.rj_span_id, 'SP(N|Q|R|S).*_(BU|MP)$')
AND sp.INVENTORY_STATUS_CODE = 'IPL'
AND sp.RJ_MAINTENANCE_ZONE_CODE = 'INMUNVMB01'
AND NVL(INSTR(sp.RJ_INTRACITY_LINK_ID, '_'), 1) > 0
AND NOT EXISTS (SELECT 'X'
                FROM APP_FTTX.transmedia@SAT tm
                WHERE tm.rj_span_id = sp.rj_span_id
                AND tm.rj_maintenance_zone_code = sp.rj_maintenance_zone_code
                AND tm.inventory_status_code = sp.inventory_status_code);

Обратите внимание на проверку NULL на tm.rj_span_id. Это столбец, который должен быть гарантированно заполнен, учитывая наш другой лог c. Поскольку это NULL, мы знаем, что совпадение не найдено.

Я также сделал несколько других настроек:

  1. Нет смысла делать length(sp.RJ_SPAN_ID) = length(tm.RJ_SPAN_ID) в нижней части. Вы уже проверили, что значения равны в течение JOIN. Если их значения равны, длина должна быть одинаковой.
  2. Подумайте об использовании REGEXP_LIKE для упрощения вашей логики c. Что-то вроде REGEXP_LIKE(sp.rj_span_id, 'SP(N|Q|R|S).*_(BU|MP)$')
  3. Удалено TO_CHAR в списке столбцов. Как уже говорилось в комментариях, они уже являются строками.
  4. Я изменил ваши NOT LIKE и IS NULL, чтобы использовать NVL AND INSTR, но это всего лишь мои предпочтения (я играл Code Golf и это повлияло на мой мозг)

Что касается вашего INSERT, просто добавьте это SELECT к INSERT INTO table_name и все готово. Например:

INSERT INTO log_table_name
  SELECT DISTINCT sp.RJ_SPAN_ID AS SPAN_ID,
                  sp.RJ_MAINTENANCE_ZONE_CODE AS MAINT_ZONE_CODE,
                  SYSDATE AS UPDATED_DATE,
                  'YOUR_USERNAME' AS USERNAME
  FROM   APP_FTTX.span@SAT sp
  WHERE  LENGTH(sp.RJ_SPAN_ID) = 21
  AND REGEXP_LIKE(sp.rj_span_id, 'SP(N|Q|R|S).*_(BU|MP)$')
  AND sp.INVENTORY_STATUS_CODE = 'IPL'
  AND sp.RJ_MAINTENANCE_ZONE_CODE = 'INMUNVMB01'
  AND NVL(INSTR(sp.RJ_INTRACITY_LINK_ID, '_'), 1) > 0
  AND NOT EXISTS (SELECT 'X'
                  FROM APP_FTTX.transmedia@SAT tm
                  WHERE tm.rj_span_id = sp.rj_span_id
                  AND tm.rj_maintenance_zone_code = sp.rj_maintenance_zone_code
                  AND tm.inventory_status_code = sp.inventory_status_code);  

Примечание. Я жестко закодировал столбец UPDATED_BY, поскольку не знаю правильного значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...