【发布时间】: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 行或更多行时,您需要告诉我们您想要什么。例如,子查询返回:X、Y、Z,在这种情况下预期的结果是什么?X或Y或Z?或者可能是XYZ或YZ或ZYX?我们不知道您想要得到什么结果。