oracle select语句中的值太多

Posted

技术标签:

【中文标题】oracle select语句中的值太多【英文标题】:Too many values in oracle select statment 【发布时间】:2019-02-23 13:54:24 【问题描述】:

我在执行以下查询时收到 oracle ORA-00913: too many values 错误。

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 行开始)返回不止一行 正确!但是我如何调整这个查询以获得我想要的格式的 xml 输出?如果我进行正常连接并将其传递给 xml 转换函数,那么我的问题名称将嵌入到每个部分节点中。示例操作如下。 Questionnaire-3030Section 4SECTION-1033153false ....... 【参考方案1】:

当我使用硬编码值“Questionnaire-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 here 上发布了一个演示,但不幸的是 GUI 不能很好地与 oracle.xdb.XMLTypeFactory 配合使用:(

【讨论】:

完美运行!非常感谢 APC。您节省了我的反复试验时间 :) 这是您建议的查询操作。 YSP_001_V2
Section 3SECTION -1033142true1【参考方案2】:

标量子查询只能返回一列一行。

例如,您可以这样做:

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

但你不能这样做:

select (select 1, 2 from dual) as thiswontwork
from   dual;

【讨论】:

谢谢@William!这帮助我理解了基本概念:)

以上是关于oracle select语句中的值太多的主要内容,如果未能解决你的问题,请参考以下文章

Python中的ValueError:解压缩的值太多[重复]

为啥这个 Django 错误“要解压的值太多”?

Python:解包的值太多(字典)

Python2.7:要解包的值太多 - 列数未知

PL/SQL 过程 - 值太多

SQL 错误:ORA-00913:值太多 00913.00000 -“值太多”