Запрос со встроенным КУРСОРОМ — в чем ошибка?

#sql #oracle

#sql #Oracle

Вопрос:

Следующий запрос работает….

 SELECT art.cmp_lvl,
              (
               CURSOR (
                 SELECT   a.cmp_lvl,
                          (
                            CURSOR (
                              SELECT   b.cmp_lvl_code,
                                       b.v1 "R_ST",
                                       b.f_name
                                  FROM temp_data b
                                 WHERE b.cmp_lvl = a.cmp_lvl
                              ORDER BY SEQ
                            )
                          ) employee
                     FROM temp_data a
                    WHERE a.cmp_lvl = art.cmp_lvl
                 GROUP BY a.cmp_lvl
               )
              ) g_pos_record
         FROM temp_data art
        WHERE art.report_name = 'EMP_REPORT'
        GROUP BY cmp_lvl
        ORDER BY cmp_lvl DESC;
  

Затем я просто добавляю другое имя столбца, как показано ниже

 SELECT art.cmp_lvl,
       art.v1                    /*ADDED THIS LINE, SHOWS AN ERROR IN THIS LINE */
              (
               CURSOR (
                 SELECT   a.cmp_lvl,
                          a.v1   /*ADDED THIS LINE */
                          (
                            CURSOR (
                              SELECT   b.cmp_lvl_code,
                                       b.v1 "R_ST",
                                       b.f_name 
                                  FROM temp_data b
                                 WHERE b.cmp_lvl = a.cmp_lvl
                                   AND b.v1 = a.v1           /*ADDED THIS LINE */
                              ORDER BY SEQ
                            )
                          ) employee
                     FROM temp_data a
                    WHERE a.cmp_lvl = art.cmp_lvl
                      AND a.v1 = art.v1                      /*ADDED THIS LINE */
                 GROUP BY a.cmp_lvl
               )
              ) g_pos_record
         FROM temp_data art
        WHERE art.report_name = 'EMP_REPORT' 
        GROUP BY cmp_lvl
        ORDER BY cmp_lvl DESC;
  

Ошибка: ORA-00904: «ART», «V1»: недопустимый идентификатор
00904. 00000 — «%s: недопустимый идентификатор» «Причина
* Ошибка действия в строке 2

Я не могу понять, почему. Добавленный столбец находится в таблице (наверняка).

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

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

2. Спасибо. Исправлено, и вы ответили по существу.

3. хорошо, что вы помните, что вопрос был задан 2 недели назад: O

Ответ №1:

Вы объединяете свои данные в одну результирующую строку для каждого cmp_lvl ( GROUP BY cmp_lvl ). Затем вы хотите показать версию v1 cmp_lvl. Однако, поскольку существует несколько строк для каждого cmp_lvl, которые вы агрегируете, v1 какой строки должен быть показан?

Более того, после art.v1 не хватает запятой.

Одно из решений состоит в том, чтобы выбрать для одного v1, например:

 SELECT art.cmp_lvl,
       MAX(art.v1),
       ...