Оптимизация запроса на основе ранга в Create View

#sql #oracle #create-view

#sql #Oracle #создать-просмотр

Вопрос:

У меня есть представление, и я использовал 2 варианта выбора, чтобы использовать функцию ранжирования. Есть ли способ оптимизировать это и избежать 2 предложений выбора и сделать его единым.

Запрос выглядит следующим образом :

 CREATE OR REPLACE VIEW "TEMP" (
   "P_LOCAL_POLICY_ID",
   "P_GIRDA_POLICY_ID",
   "C_OE_CONS_UNIT_TITLE",
   "C_ROW_NUMBER",
   "C_LOAD_TIMESTAMP",
   "ERROR_TEXT",
   "RECORD_2_DELETE",
   "ERROR_TIMESTAMP",
   "RANK_NUMBER"
) AS
   SELECT
       p_local_policy_id,
       p_girda_policy_id,
       c_oe_cons_unit_title,
       c_row_number,
       c_load_timestamp,
       err_error_text,
       err_record_2_delete,
       err_load_timestamp,
       RANK() OVER(PARTITION BY
           err_error_text
           ORDER BY
               ROWNUM
       )
   FROM
       (
           SELECT
               po.local_policy_id AS p_local_policy_id,
               po.girda_policy_id AS p_girda_policy_id,
               MAX(cl.oe_cons_unit_title) AS c_oe_cons_unit_title,
               SUM(cl.row_number) AS c_row_number,
               MAX(cl.load_timestamp) AS c_load_timestamp,
               error.error_text AS err_error_text,
               error.record_2_delete AS err_record_2_delete,
               error.load_timestamp AS err_load_timestamp
           FROM
              <condition>
           WHERE
                  <condition>
           GROUP BY
               po.local_policy_id,
               po.girda_policy_id,
               error.error_text,
               error.record_2_delete,
               error.load_timestamp
       );   
  

Спасибо,
Читра

Ответ №1:

Вы можете объединить два блока списка выбора как

 CREATE OR REPLACE VIEW TEMP AS
SELECT po.local_policy_id AS "P_LOCAL_POLICY_ID",
       po.girda_policy_id AS "P_GIRDA_POLICY_ID",
       MAX(cl.oe_cons_unit_title) AS "C_OE_CONS_UNIT_TITLE",
       SUM(cl.row_number) AS "C_ROW_NUMBER",
       MAX(cl.load_timestamp) AS "C_LOAD_TIMESTAMP",
       error.error_text AS "ERROR_TEXT",
       error.record_2_delete AS "RECORD_2_DELETE",
       error.load_timestamp AS "ERROR_TIMESTAMP",
       RANK() OVER( PARTITION BY err_error_text ORDER BY 1 ) AS "RANK_NUMBER"
  FROM <condition>
 WHERE <condition>
 GROUP BY po.local_policy_id, po.local_region,
          error.error_text, error.record_2_delete, error.load_timestamp
  
  • нет необходимости перечислять псевдонимы столбцов после имени представления.
  • символы подчеркивания могут быть удалены в именах столбцов, таких как "P LOCAL POLICY ID" вместо "P_LOCAL_POLICY_ID" как уже заключенные в кавычки

Комментарии:

1. я могу дать вам полный код, могу ли я прикрепить его в виде файла здесь?

2. ORA-00979: не ГРУППИРУЕТСЯ По выражению 00979. 00000 — «не ГРУППИРУЕТСЯ ПО выражению»

3. это говорит слишком долго

4. я обновил код в главном разделе. пожалуйста, проверьте

5. @chithra просто замените ROWNUM константой, такой 1 как в предложении ORDER BY аналитической функции. Поскольку это искажает группировку как неагрегированный столбец.