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-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。您节省了我的反复试验时间 :) 这是您建议的查询操作。标量子查询只能返回一列一行。
例如,您可以这样做:
select (select 1 from dual) as c1
from dual;
但你不能这样做:
select (select 1, 2 from dual) as thiswontwork
from dual;
【讨论】:
谢谢@William!这帮助我理解了基本概念:)以上是关于oracle select语句中的值太多的主要内容,如果未能解决你的问题,请参考以下文章