【问题标题】:Single row subquery returns more than one row SQL Oracle单行子查询返回多行 SQL Oracle
【发布时间】:2016-12-23 04:24:19
【问题描述】:

我试图让多行显示在同一行。我有以下代码:

SELECT DISTINCT
  SUBSTR(JOB.JOBNAME,1,25) "Jobname",'|',
  (SELECT SUBSTR(VAR.VAREXPR,1,15) 
FROM CTMSLO80.CMS_SETVAR VAR
    WHERE var.var = '%%PS8-PRCSNAME'
      AND JOB.jobno   =  VAR.jobno) "Process",'|',
  (SELECT SUBSTR(VAR.VAREXPR,1,30) FROM CTMSLO80.CMS_SETVAR VAR
    WHERE var.var = '%%PS8-RUNCONTROLID'
      AND JOB.jobno   =  VAR.jobno) "Run Cntrl ID",'|',
  NVL((SELECT SUBSTR(VAR.VAREXPR,1,20) FROM CTMSLO80.CMS_SETVAR VAR
    WHERE var.var = '%%PS8-PRCSTYPE'
      AND JOB.jobno   =  VAR.jobno), ' ') "Process Type",'|',
  SUBSTR(DAYSCAL,1,10) "Calendar",'|',
  NVL2(JOB.FROMTIME,SUBSTR(JOB.FROMTIME,1,2)||':'||SUBSTR(JOB.FROMTIME,3,2),' ') "From",'|',
  NVL2(JOB.Until  ,SUBSTR(JOB.Until,1,2)||':'||SUBSTR(JOB.Until,3,2),' ') "Until",'|',
   Case
WHEN JOB.DAYSTR = 'ALL' THEN
JOB.DAYSTR
Else
SUBSTR(NVL(REPLACE(REPLACE(REPLACE(REPLACE(TRANSLATE(JOB.WDAYSTR,'01234567AL','0MTW4F7AL'),'0','Su'),'4','Th'),'7','Sa'),'ALL','Daily'),' '),1,16)
End
"Days",'|',
  NVL(JOB.DESCRIPT,' ') "Description",'|',
  SUBSTR (job.jobname,1,5) "Table",'|',
(SELECT SUBSTR (CON.CONDNAME,1,75) FROM CTMSLO80.CMS_CON_J CON
   WHERE CON.ROWTYPE = 'I' 
   AND JOB.JOBNO = CON.JOBNO) "In Cond",'|',
  (SELECT SUBSTR(VAR.VAREXPR,1,35) FROM CTMSLO80.CMS_SETVAR VAR
    WHERE var.var = '%%PS8-DESCRIPTION'
      AND JOB.jobno   =  VAR.jobno) "Description",'|',
  SUBSTR(JOB.OWNER,1,6) "BMCID",'|',
  NVL2(JOB.DESCRIPT,(SUBSTR(JOB.DESCRIPT,1,INSTR(JOB.DESCRIPT,'/',1,1)-1)),'1') JOBORDER
  FROM CTMSLO80.CMS_JOBDEF JOB, CTMSLO80.CMS_SETVAR VAR
      where  OWNER LIKE 'BMCHR'
      and JOB.JOBno   =  VAR.JOBno

我遇到麻烦的部分是:

(SELECT SUBSTR (CON.CONDNAME,1,75) FROM CTMSLO80.CMS_CON_J CON
   WHERE CON.ROWTYPE = 'I' 
   AND JOB.JOBNO = CON.JOBNO) "In Cond",'|',

它会返回一个值,但是如果我有多个值要返回,它会报错“ORA-01427:单行子查询返回多于一行”

我尝试了各种方法,如 XML 路径、IN、EXISTS 等,但这些方法给了我不同的错误,我无法解决。有人有过类似的经历吗?

============================

感谢您的回复

PL/SQL 为 9.0.6.1655 时的版本

不知道你所说的“分隔符”是什么意思

没有成功将代码分解成更小的块。我没有编写大部分代码,但正在尝试对其进行调整以适应我正在尝试做的事情。

提供的链接确实有助于消除错误。我使用了“MAX”函数并将相关查询更改为:

(SELECT max(SUBSTR (CON.CONDNAME,1,75)) FROM CTMSLO80.CMS_CON_J CON
   WHERE CON.ROWTYPE = 'I' 
   AND JOB.JOBNO = CON.JOBNO) "In Cond",'|',

现在它将至少返回第一项。但是,我希望能够退回多个项目。这部分查询返回一个具有如下值的列:

在条件下

例子1

还有更多数据要提取,但我希望它像这样返回:

在条件下

例子1,例子2

关于如何让它做到这一点的任何想法?

【问题讨论】:

  • 如果有多个值,您希望看到什么?您真的想要进行连接(而不是子查询)然后使用字符串聚合来组合值吗? (如果是这样 - 哪个版本的 Oracle,以及哪个分隔符?)。将您的代码简化为一个简单的示例,其中包含表格、数据和预期结果,真的很有帮助。
  • 这是预期行为。您正在尝试加入多个单独的值。正如建议的那样,子查询可能会更好,或者如果您真的只对第一个结果感兴趣,您可能希望将条件更改为仅查看顶部结果(这可能是也可能不是您真正想要的) .
  • 更新了我的帖子
  • Anyone have experience with something like this? - 好吧,当子查询返回 2 行或更多行时,您需要告诉我们您想要什么。例如,子查询返回:XYZ,在这种情况下预期的结果是什么? XYZ ?或者可能是 XYZYZZYX ?我们不知道您想要得到什么结果。

标签: sql oracle


【解决方案1】:

如果你想要一个列表,请使用LISTAGG()

(SELECT LISTAGG(SUBSTR(CON.CONDNAME, 1, 75), '|') WITHIN GROUP (ORDER BY CON.CONDNAME)
 FROM CTMSLO80.CMS_CON_J CON
 WHERE CON.ROWTYPE = 'I' AND JOB.JOBNO = CON.JOBNO
)  as "In Cond", 

请注意,列表的最大大小受 Oracle 对字符串的限制,即 4,000 个字符。如果您的列表太长,您可能会溢出。

【讨论】:

  • 是的!我只是根据最后一条评论对其进行编辑,并且与您发布的内容相似,但有一些错误。这个答案适用于 PL/SQL Oracle 类型的数据库。谢谢大家!!
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2020-12-20
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多