Oracle SYS_CONNECT_BY_PATH не работает должным образом (всегда ноль) - PullRequest
0 голосов
/ 17 апреля 2019

Я схожу с ума от этого странного поведения.

Я использую 2 запроса SYS_CONNECT_BY_PATH, но один из них всегда получает нулевое значение, в то время как я проверял наличие значений.

Цель состоит в том, чтобы объединить несколько строк в одну, разделенных запятыми.

Это рабочий:

SELECT id_audit_req, SUBSTR(MAX(SYS_CONNECT_BY_PATH (profs_names, ', ')), 3) all_descriptions
            FROM (SELECT ROW_NUMBER () OVER (PARTITION BY id_audit_req ORDER BY id_audit_req, profs_names) rnum, id_audit_req, profs_names
                    FROM (SELECT id_audit_req, nvl(p.nick_name, p.name) profs_names
                            FROM audit_req_prof arp, professional p
                           WHERE arp.flg_rel_type = 'A'
                             AND arp.id_professional = p.id_professional
                          )
                  )
           START WITH rnum = 1
          CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR id_audit_req = id_audit_req
           GROUP BY id_audit_req

В этом запросе внутренние (до SYS_CONNECT_BY_PATH) результаты SQl равны

rnum id_audit_req profs_names
   1            1 Auditor   
   1          501 Auditor   
   1          502 Auditor   
   2          502 Auditor2  
   1          503 Auditor   
   1          504 Auditor   
   1          505 Auditor   
   2          505 Auditor2 

И окончательный результат верен:

id_audit_req all_descriptions   
           1 Auditor           
         504 Auditor           
         502 Auditor, Auditor2
         505 Auditor, Auditor2
         503 Auditor           
         501 Auditor           

Теперь у меня есть другой запрос, и внутренний результат также верен, но окончательный результат равен нулю, и я не знаю почему:

SELECT id_epis_triage, SUBSTR (MAX(SYS_CONNECT_BY_PATH (bp, ', ')), 3) all_descriptions
                            FROM (SELECT ROW_NUMBER () OVER (PARTITION BY id_epis_triage ORDER BY id_epis_triage, bp desc) rnum, id_epis_triage, bp
                                    FROM (SELECT id_epis_triage, vsr.VALUE as bp
                                               FROM vital_sign_read vsr, vital_sign vs
                                              WHERE vsr.id_epis_triage in (SELECT arpe.id_epis_triage FROM audit_req_prof_epis  arpe
                                                                                 WHERE arpe.id_audit_req_prof = 2)
                                                AND vsr.flg_state = 'A'
                                                AND vsr.id_vital_sign IN (SELECT id_vital_sign_detail FROM vital_sign_relation WHERE relation_domain = 'C')
                                                AND vsr.dt_vital_sign_read in
                                                    (SELECT vsr2.dt_vital_sign_read
                                                       FROM vital_sign_read vsr2
                                                      WHERE (vsr2.id_epis_triage, vsr2.dt_vital_sign_read) IN
                                                            (SELECT id_epis_triage, MAX(vsr4.dt_vital_sign_read)
                                                            FROM alert.vital_sign_read vsr4
                                                           WHERE vsr4.id_epis_triage in (SELECT arpe.id_epis_triage FROM audit_req_prof_epis  arpe
                                                                                 WHERE arpe.id_audit_req_prof = 2)
                                                             AND vsr4.id_vital_sign = vsr.id_vital_sign
                                                             AND vsr4.flg_state = 'A'
                                                             group by id_epis_triage)
                                                        AND vsr2.id_vital_sign = vsr.id_vital_sign
                                                        AND vsr2.id_vital_sign IN (SELECT id_vital_sign_detail
                                                                                     FROM vital_sign_relation
                                                                                    WHERE relation_domain = 'C'
                                                                                      AND vsr2.id_epis_triage in (SELECT arpe.id_epis_triage FROM audit_req_prof_epis  arpe
                                                                                         WHERE arpe.id_audit_req_prof = 2)
                                                                                      AND id_vital_sign_parent = 28)
                                                        AND vsr2.flg_state = 'A')
                                                AND vs.id_vital_sign = vsr.id_vital_sign
                                                ORDER BY vs.intern_name_vital_sign
                                     )
                         )
                         START WITH rnum = 1
                         CONNECT BY PRIOR rnum = rnum - 1 and PRIOR id_epis_triage = id_epis_triage
                         group by id_epis_triage

Внутренний результат:

rnum id_epis_triage  bp
   1           2134 120
   2           2134  85
   1           2137 112
   2           2137  98

Окончательный результат:

Нулевой

У кого-нибудь есть идеи? Я перепробовал много вариантов, почти всегда один и тот же результат. Только если я уберу предложение START WITH, я получу следующее:

id_epis_triage all_descriptions
          2134 85              
          2137 98              

Похоже, он получает только последнее значение для каждого числа. Но, по сути, оба SQL одинаковы, структура точно такая же.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Итак, последняя проблема была ... подзапрос кажется таким большим, и SYS_CONNECT_BY_PATH не работает должным образом (по крайней мере, в моей версии Oracle 10.2).

Поэтому я уточнил подзапрос SQL, чтобы получить аналогичный результат, но с меньшим количеством текста, и это был результат:

SELECT id_epis_triage, SUBSTR (MAX(SYS_CONNECT_BY_PATH (bp, ', ')),3) all_descriptions
                            FROM (SELECT ROW_NUMBER () OVER (PARTITION BY id_epis_triage ORDER BY id_epis_triage, bp desc) rnum, id_epis_triage, bp
                                    FROM    (SELECT id_epis_triage, vsr.VALUE as bp
                                               FROM vital_sign_read vsr, vital_sign vs
                                              WHERE vsr.flg_state = 'A'
                                                AND vsr.id_vital_sign = vsr.id_vital_sign
                                                AND vs.id_vital_sign = vsr.id_vital_sign
                                                AND vsr.id_vital_sign IN (SELECT id_vital_sign_detail
                                                                                     FROM vital_sign_relation
                                                                                    WHERE relation_domain = 'C'
                                                                                      AND id_vital_sign_parent = 28)
                                                AND (vsr.id_epis_triage, vsr.dt_vital_sign_read) IN
                                                     (SELECT id_epis_triage, MAX(vsr4.dt_vital_sign_read)
                                                        FROM vital_sign_read vsr4
                                                       WHERE   vsr4.flg_state = 'A'
                                                         AND vsr4.id_epis_triage in (SELECT arpe.id_epis_triage FROM audit_req_prof_epis arpe WHERE arpe.id_audit_req_prof = 2)
                                                        group by id_epis_triage
                                                     )
                                              ORDER BY vs.intern_name_vital_sign
                                     )
                         )
                         START WITH rnum = 1
                         CONNECT BY PRIOR rnum = rnum - 1  and prior id_epis_triage = id_epis_triage
                         group by id_epis_triage;

Действительно странная проблема, но благодаря @Boneist я ищу эту альтернативу.

id_epis_triage all_descriptions
          2134 120, 85         
          2137 112, 98         
0 голосов
/ 17 апреля 2019

Кажется, у меня работает (я на 11.2.0.4):

WITH inner_result AS (SELECT 1 rnum, 2134 id_epis_triage, 120 bp FROM dual UNION ALL
                      SELECT 2 rnum, 2134 id_epis_triage, 85 bp FROM dual UNION ALL
                      SELECT 1 rnum, 2137 id_epis_triage, 112 bp FROM dual UNION ALL
                      SELECT 2 rnum, 2137 id_epis_triage, 98 bp FROM dual)
SELECT id_epis_triage,
       substr(MAX(sys_connect_by_path(bp, ', ')), 3) all_descriptions
FROM   inner_result
START  WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1
    AND    PRIOR id_epis_triage = id_epis_triage
GROUP  BY id_epis_triage;

ID_EPIS_TRIAGE ALL_DESCRIPTIONS
-------------- ----------------
          2137 112, 98
          2134 120, 85

В какой версии вы работаете и работает ли вышеуказанный запрос (как есть, включая подзапрос inner_result)?

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