0

我的过程中有以下 sql,但是当我在 Select 中使用 Case 时,它​​给出了“单行查询返回多行”错误。所以我将查询拆分为多个选择,最后通过合并我上面创建的所有临时表来编写输出。

我使用了 Select 和 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。对于系统来说,这似乎是性能密集型的。

4

1 回答 1

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;

为您的每个子选择执行此操作并检查案例陈述。应该提高性能并消除错误。

于 2019-10-11T12:11:19.017 回答