как соединить оператор множественного выбора с полным внешним соединением.Ошибка: подзапрос возвращает более одной строки - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть этот код, с которым боролись со вчерашнего дня, когда я тестирую каждую часть этого кода, он работает, но мне нужно собрать их вместе, чтобы сгенерировать один выходной результат.Это полный код ниже: но дает подзапрос возвращает более одной строки.

SELECT NVL(TO_CHAR(D_TRANS.TRANS), 'NULL') AS ID, 'HEADER', D_SPILL.status, 
      (SELECT L_APPLICATION.APPLICATION 
         FROM L_APPLICATION   L_APPLICATION 
        WHERE LANGUAGE = 2 AND APPLICATION = D_TRANS.APPLICATION) 
      AS CASE_TYPE, 
      NVL(TO_CHAR(D_TRANS.UNIT_IN_CHARGE), 'NULL') AS UNIT_IN_CHARGE,
      NVL(TO_CHAR(D_TRANS.PERSON_IN_CHARGE), 'NULL') AS PERSON_IN_CHARGE,
      NVL(TO_CHAR(D_TRANS.STATUS), 'NULL') AS CASE_STATUS, 
      NVL(TO_CHAR(D_TRANS.DEADLINE), 'NULL') AS INTERNAL_DEADLINE,
            ( select   xmlquery('distinct-values(//text())' passing xmldoc returning content).getclobVal()
       FROM  ( select  d_synergi_category.trans, 
       coalesce(max(case when language =  2 then description end), 'NULL'), 
         XMLELEMENT(root,xmlagg(XMLELEMENT(e,description,','))
                  ) xmldoc
           from L_CASE_CATEGORY  
         LEFT JOIN  d_synergi_category ON  d_synergi_category.case_category          = L_CASE_CATEGORY.case_category 
         group by  d_synergi_category.trans

             )
                      )              
                  FROM D_TRANS
             FULL OUTER  JOIN D_SPILL
              ON D_TRANS.TRANS=D_SPILL.TRANS
               ORDER BY D_TRANS.TRANS DESC;

               If I remove the part code  below with xmltagg and test both parts of the code separately it is working. 

Первая часть работает отдельно

  ( select   xmlquery('distinct-values(//text())' passing xmldoc returning content).getclobVal()
       FROM  ( select  d_synergi_category.trans, 
       coalesce(max(case when language =  2 then description end), 'NULL'), 
         XMLELEMENT(root,xmlagg(XMLELEMENT(e,description,','))
                  ) xmldoc
  from L_CASE_CATEGORY  
     LEFT JOIN  d_synergi_category ON  d_synergi_category.case_category =         L_CASE_CATEGORY.case_category 
  group by  d_synergi_category.trans

))

Вторая часть работает отдельно:

SELECT NVL(TO_CHAR(D_TRANS.TRANS), 'NULL') AS ID, 'HEADER',D_SPILL.status, 
   (SELECT L_APPLICATION.APPLICATION FROM L_APPLICATION 
    WHERE L_APPLICATION WHERE LANGUAGE = 2 
     AND APPLICATION = D_TRANS.APPLICATION) AS CASE_TYPE , 
    NVL(TO_CHAR(D_TRANS.UNIT_IN_CHARGE), 'NULL') AS UNIT_IN_CHARGE, 
    NVL(TO_CHAR(D_TRANS.PERSON_IN_CHARGE), 'NULL') AS PERSON_IN_CHARGE, 
    NVL(TO_CHAR(D_TRANS.STATUS), 'NULL') AS CASE_STATUS , 
    NVL(TO_CHAR(D_TRANS.DEADLINE), 'NULL') AS INTERNAL_DEADLINE
  FROM D_TRANS
  FULL OUTER  JOIN D_SPILL
       ON D_TRANS.TRANS=D_SPILL.TRANS
   ORDER BY D_TRANS.TRANS DESC;

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Что сказал @Littlefoot, но я собираюсь догадаться, как можно объединить ваши таблицы, чтобы у вас был пример.

SELECT NVL(TO_CHAR(D_TRANS.TRANS), 'NULL') AS ID, 'HEADER',D_SPILL.status, 
   (SELECT L_APPLICATION.APPLICATION FROM L_APPLICATION 
    WHERE L_APPLICATION WHERE LANGUAGE = 2 
     AND APPLICATION = D_TRANS.APPLICATION) AS CASE_TYPE , 
    NVL(TO_CHAR(D_TRANS.UNIT_IN_CHARGE), 'NULL') AS UNIT_IN_CHARGE, 
    NVL(TO_CHAR(D_TRANS.PERSON_IN_CHARGE), 'NULL') AS PERSON_IN_CHARGE, 
    NVL(TO_CHAR(D_TRANS.STATUS), 'NULL') AS CASE_STATUS , 
    NVL(TO_CHAR(D_TRANS.DEADLINE), 'NULL') AS INTERNAL_DEADLINE,
    (SELECT  rtrim(xmlagg( 
             XMLELEMENT(e,L_CASE_CATEGORY.DESCRIPTION,',').EXTRACT('//text()')
              ).GetClobVal(),',') 
     FROM L_CASE_CATEGORY
     INNER JOIN   D_SYNERGI_CATEGORY  on  -- changed
           D_SYNERGI_CATEGORY.CASE_CATEGORY = L_CASE_CATEGORY.CASE_CATEGORY   
         AND L_CASE_CATEGORY.LANGUAGE = 2 
     WHERE d_synergi_category.trans = D_TRANS.TRANS -- added this line
     GROUP BY  D_SYNERGI_CATEGORY.CASE_CATEGORY, d_synergi_category.trans) AS CAT_DESC_LIST
  FROM D_TRANS
  FULL OUTER  JOIN D_SPILL
       ON D_TRANS.TRANS=D_SPILL.TRANS
   ORDER BY D_TRANS.TRANS DESC;

Редактировать: обновлено из вашего комментария.Это было бы намного проще, если бы вы предоставили структуру таблицы и пример данных.

0 голосов
/ 14 февраля 2019

Ваш подзапрос SELECT rtrim(xmlagg(... возвращает одну строку для CASE_CATEGORY и trans из-за:

GROUP BY D_SYNERGI_CATEGORY.CASE_CATEGORY, d_synergi_category.trans

Однако, когда вы помещаете его в предложение select основного запроса, вы не хотитеон возвращает все эти строки на главную строку запроса, но одну строку, соответствующую основной строке запроса (точно так же, как вы находите соответствующую строку приложения с WHERE APPLICATION = D_TRANS.APPLICATION).

Поэтому удалите предложение GROUP BY и заменитевместо этого с предложением WHERE.Что-то вроде

(
  SELECT
    RTRIM(XMLAGG( 
       XMLELEMENT(e, cc.description,',').EXTRACT('//text()')
    ).GetClobVal(),',') 
  FROM l_case_category cc
  JOIN d_synergi_category sc ON sc.case_category = cc.case_category   
  WHERE sc.case_category = d_spill.case_category -- <=== here
    AND sc.trans = d_trans.trans -- <=== and here
    and cc.language = 2
)

(Просто замените мои критерии вашими реальными критериями. Только вы знаете, как связаны таблицы. Мне трудно даже понять, что должен вернуть запрос.Я не понимаю, почему вы полностью используете внешнее соединение с D_SPILL в одном из отдельных запросов, не используя ни одного из его столбцов в предложении select. Я также не знаю, почему вы внешне объединяете D_SYNERGI_CATEGORY с L_CASE_CATEGORY.LANGUAGE = 2 в другомзапрос. Это кажется странным.)

0 голосов
/ 14 февраля 2019

Запрос (SELECT rtrim(xmlagg( ... должен возвращать ровно одну строку.

У нас нет ни ваших таблиц, ни данных, но кажется, что вы не объединяли его таблицы (L_CASE_CATEGORY, D_SYNERGI_CATEGORY) слюбая из таблиц, содержащихся в предложении FROM основного запроса (TRANS, D_SPILL).Я предлагаю вам сделать это и посмотреть, что произойдет.

[ПРАВИТЬ]

Вот что я имел в виду:

select nvl(to_char(d_trans.trans, 'null') as id,
       ...,
       rtrim(xmlagg(xmlelement(...)) as some_name          --> XLM stuff goes here
  from l_case_category left join d_synergi_category on ...
       join l_case_category on ...                         --> XML subquery's tables go here,
                                                           --> properly joined to other tables
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...