我的过程中包含以下sql,但是在Select中使用Case时,出现“单行查询返回多个行”错误。因此我将查询分为多个Select,最后通过合并上面创建的所有临时表来写入输出。
我使用了Select and Case,但是给出了错误消息“单行查询返回了多行”。
OUTTAB = SELECT A.MATERIAL,
A.BOM,
A.PARENTBOM,
A.STEPNUM,
B.VALIDFROM AS PARENTBOMFR,
(CASE WHEN B.BOMCOUNT = 1
THEN '99991231'
WHEN B.BOMCOUNT >= 2
THEN (CASE WHEN B.VALIDFROM = (SELECT E.VALIDTO FROM :LT_TEMP1 AS E WHERE A.PARENTBOM = E.BOM)
THEN '99991231'
ELSE ( SELECT TO_DATS(ADD_DAYS(C.VALIDTO, -1)) FROM :LT_TEMP2 AS C
WHERE A.PARENTBOM = C.BOM
AND B.VALIDFROM = (SELECT D.VALIDFROM FROM :LT_TEMP3 AS D WHERE A.PARENTBOM = D.BOM))
END)
ELSE '99991231'
END) AS PARENTBOMTO,
A.COMPONENT,
FROM :INTAB AS A
INNER JOIN :LT_TEMP AS B
ON A.PARENTBOM = B.BOM;
LT_TEMP1,2,3是为每个级别构建的临时表。
在上述查询中运行时,出现“单行查询返回多行”错误。因此,我通过与INTAB进行连接将3个临时表划分为一个级别,最后通过所有3个临时表的并集写入OUTTAB。对于系统来说,这似乎需要大量的性能。
答案 0 :(得分:0)
当您具有过程并且可以确定时,子选择应该只返回一个值,您可以在末尾添加:: rowcount = 0。 因此,“单行查询返回多行”错误将不再返回。
您还可以尝试将所有选中的变量保存在变量的子选择中。
在代码的一开始就声明变量。然后使用以下语法声明它们:
delcare date validTo;
SELECT D.VALIDFROM INTO validTo FROM :LT_TEMP3 AS DINNER JOIN :INTAB as A on A.PARENTBOM = D.BOM ::rowcount = 0;
对您的每个子选择执行此操作,然后检查案例陈述。 应该提高性能并消除错误。