Слишком много значений в уставе выбора - PullRequest
0 голосов
/ 23 февраля 2019

Я получаю оракул ORA-00913: слишком много значений ошибка при выполнении следующего запроса.

SELECT qst.QUE_NAME,
  (SELECT sec2.SECTION_NAME AS "sectionName",
    sec2.SECTION_ID_PK      AS "sectionId",
    sec2.SECTION_SEQUENCE   AS "sequence",
    CASE(sec2.ENABLE_SCORING)
      WHEN '1'
      THEN 'true'
      ELSE 'false'
    END AS "hasScore",
    sec2.SECTION_WEIGHTAGE,
    sec2.SEC_TOTAL_SCR_WEIGHTAGE,
    sec2.SECTION_TYPE
  FROM MS_XRQ_SECTION sec2
  WHERE sec2.section_category=2
  AND sec2.SECTION_QUESTNR_FK=qst.INTERNAL_QUESTNR_ID
  )
FROM MS_XRQ_QUESTIONNAIRE qst
WHERE qst.INTERNAL_QUESTNR_ID= 'Questionnaire-3032';

Когда я запускаю второй оператор выбора (который находится в скобках) с жестко закодированнымзначение 'Questionnaire-3032' возвращает правильный результат.

Также, когда я запускаю следующий запрос, он также возвращает 1 запись.

SELECT qst.QUE_NAME FROM MS_XRQ_QUESTIONNAIRE qst WHERE qst.INTERNAL_QUESTNR_ID= 'Questionnaire-3032';

Так что эти два автономных запроса работают нормально.Но когда я хочу объединить их результаты в один, я получаю эту ошибку.Я не могу понять, что я делаю здесь неправильно!Может кто-нибудь сказать мне, почему это происходит?

Я также хотел бы передать этот запрос в функцию dbms_xmlgen.getxmltype(), чтобы получить вывод, подобный следующему.

<question> 
<name> Q1</name>
<sections>
<section> s1</section>
<section> s2</section>
</sections>
<questions>

Ответы [ 2 ]

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

Скалярный подзапрос может возвращать только один столбец и одну строку.

Например, вы можете сделать это:

select (select 1 from dual) as c1
from   dual;

, но вы не можете сделать это:

select (select 1, 2 from dual) as thiswontwork
from   dual;
0 голосов
/ 23 февраля 2019

Когда я запускаю второй оператор выбора (который заключен в квадратные скобки) с жестко закодированным значением 'Анкета-3032', он возвращает правильный результат.

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

Вы не опубликовали примерные данные, поэтому я сделал несколько предположений о том, что вы хотите.Тем не менее, это решение SQL XML создает действительный документ XML и соответствует скелету в вашем вопросе.

SELECT XMLELEMENT("Questionnaire",
         XMLAGG (
           XMLELEMENT("Question",
             XMLFOREST(
               qst.QUE_NAME AS "Name",
                  (SELECT XMLAGG(
                         XMLELEMENT("Section",
                           XMLFOREST(
                              sec2.SECTION_NAME AS "sectionName",
                              sec2.SECTION_ID_PK      AS "sectionId",
                              sec2.SECTION_SEQUENCE   AS "sequence",
                              CASE(sec2.ENABLE_SCORING)
                                  WHEN '1'
                                  THEN 'true'
                                  ELSE 'false'
                              END AS "hasScore",
                              sec2.SECTION_WEIGHTAGE,
                              sec2.SEC_TOTAL_SCR_WEIGHTAGE,
                              sec2.SECTION_TYPE
                          )
                       )
                    )   
                   FROM MS_XRQ_SECTION sec2
                   WHERE sec2.section_category = 2
                   AND sec2.SECTION_QUESTNR_FK = qst.INTERNAL_QUESTNR_ID
               ) "sections"
           )
        )
      ) 
    )    
FROM MS_XRQ_QUESTIONNAIRE qst
WHERE qst.INTERNAL_QUESTNR_ID= 'Questionnaire-3032';

Я разместил демо на SQL Fiddle здесь , но, к сожалению, графический интерфейс не очень хорошо работает с oracle.xdb.XMLTypeFactory: (

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