Advertisement
Guest User

Untitled

a guest
Aug 2nd, 2019
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 4.69 KB | None | 0 0
  1. MERGE INTO appeals apl
  2. USING (
  3.     -- все обращения, по которым необходимо проставить FID-ы
  4.     WITH sq_appeals AS (
  5.         SELECT
  6.               id_appeal
  7.             , fid_appeal
  8.             , fid_type
  9.         FROM
  10.             appeals
  11.         WHERE
  12.             fid_post_data_status = -1
  13.             AND fid_type IN (1, 2, 4)
  14.     )
  15.     -- обращения клиентов
  16.     , sq_client_appeals AS (
  17.         SELECT
  18.               ca.ext_id
  19.             , ca.ops_index     AS ops_index
  20.             , apl.fid_type
  21.             , ca.ufps_name     AS ufps_name
  22.             , apl.id_appeal
  23.         FROM
  24.             sq_appeals                               apl
  25.             JOIN client_appeals                      ca
  26.                 ON apl.fid_appeal = ca.ext_id
  27.                 AND apl.fid_type = 1
  28.     )
  29.     -- обращения сотрудников
  30.     , sq_staff_appeals AS (
  31.         SELECT
  32.               sa.ext_id
  33.             , sa.ops           AS ops_index
  34.             , apl.fid_type
  35.             , sa.ufps_title    AS ufps_name
  36.             , apl.id_appeal
  37.         FROM
  38.             sq_appeals                               apl
  39.             JOIN staff_appeals                       sa
  40.                 ON apl.fid_appeal = sa.ext_id
  41.                 AND apl.fid_type = 2
  42.     )
  43.     -- обращения по доступной среде
  44.     , sq_av_env_appeals AS (
  45.         SELECT
  46.               aa.ext_id
  47.             , aa.post_index AS ops_index
  48.             , apl.fid_type
  49.             , NULL AS ufps_name
  50.             , apl.id_appeal
  51.         FROM
  52.             sq_appeals                               apl
  53.             JOIN available_env_appeals               aa
  54.                 ON apl.fid_appeal = aa.ext_id
  55.                 AND apl.fid_type = 4
  56.     )
  57.     -- все обращения, по которым необходимо проставить FID-ы
  58.     , sq_all_appeals AS (
  59.         SELECT * FROM sq_client_appeals
  60.         UNION ALL
  61.         SELECT * FROM sq_staff_appeals
  62.         UNION ALL
  63.         SELECT * FROM sq_av_env_appeals
  64.     )
  65.     SELECT
  66.           aa.id_appeal
  67.         , CASE
  68.               WHEN cts.ops_index IS NOT NULL                                                       -- нашлась связь в справочнике D_AV_ENV_CONTACTS
  69.                   THEN 0
  70.               WHEN (aa.ops_index IS NOT NULL) AND (REGEXP_LIKE(aa.ops_index, '\d{6}'))             -- индекс из обращения не найден в справочнике D_AV_ENV_CONTACTS,
  71.                   THEN 1                                                                           -- либо в поле индекса записан не индекс
  72.               WHEN du.id_ufps IS NOT NULL                                                          -- индекса нет (либо он некорректный), но нашлось соответствие по УФПС в справочнике D_UFPS
  73.                   THEN 0
  74.               WHEN aa.ufps_name IS NOT NULL                                                        -- УФПС не найден в справочнике D_UFPS
  75.                   THEN 2
  76.               ELSE 3                                                                               -- не проставлен ни индекс, ни УФПС
  77.           END                                                                            AS fid_post_data_status
  78.         , CASE WHEN cts.ops_index IS NOT NULL THEN cts.fid_post_office END               AS fid_post_office
  79.         , CASE
  80.               WHEN cts.ops_index IS NOT NULL THEN cts.fid_ufps
  81.               ELSE du.id_ufps
  82.           END                                                                            AS fid_ufps
  83.         , CASE
  84.               WHEN cts.ops_index IS NOT NULL THEN cts.fid_mr
  85.               ELSE rl.fid_mr
  86.           END                                                                            AS fid_mr
  87.     FROM
  88.         sq_all_appeals                                                     aa
  89.         LEFT JOIN d_av_env_contacts                                        cts
  90.             ON TRIM(aa.ops_index) = TRIM(cts.ops_index)
  91.         LEFT JOIN d_ufps                                                   du
  92.             ON UPPER(TRIM(aa.ufps_name)) = UPPER(TRIM(du.ufps_name))
  93.         LEFT JOIN rel_ufps_mr                                              rl
  94.             ON du.id_ufps = rl.fid_ufps
  95. ) sq
  96. ON (apl.id_appeal = sq.id_appeal)
  97. WHEN MATCHED THEN
  98.     UPDATE SET
  99.           apl.fid_mr = sq.fid_mr
  100.         , apl.fid_ufps = sq.fid_ufps
  101.         , apl.fid_post_office = sq.fid_post_office
  102.         , apl.fid_post_data_status = sq.fid_post_data_status
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement