是否有更好的方法在Select中使用Case来在SQL下进行编码?

时间:2019-08-15 16:30:28

标签: hana-sql-script

我的过程中包含以下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。对于系统来说,这似乎需要大量的性能。

1 个答案:

答案 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;

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