首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ABAP OpenSQL中使用“上一行”连接行

在ABAP OpenSQL中使用“上一行”连接行
EN

Stack Overflow用户
提问于 2018-08-01 17:28:15
回答 1查看 234关注 0票数 1

归结到基本问题上,我有两张桌子

代码语言:javascript
复制
dberchz1 (e1)
---------------------
belnr   belzeile
1       1
1       2
1       4
1       5
1       7
1       22

dberchz2 (e2/e3)
---------------------
belnr   belzeile    geraet
1       1           A
1       2           A
1       5           B
1       8           A
1       23          A

以下ABAP OpenSQL查询(Netweaver 7.50)

代码语言:javascript
复制
SELECT e1~belnr, e1~belzeile, e2~geraet, e2~belzeile FROM dberchz1 AS e1
INNER JOIN dberchz2 AS e2 ON e1~belnr = e2~belnr AND e1~belzeile <= e2~belzeile
WHERE
e2~belzeile = ( SELECT MIN( e3~belzeile ) FROM dberchz2 AS e3 WHERE e1~belnr = e3~belnr AND e1~belzeile <= e3~belzeile AND Ae3~geraet <> '' )

收益率

代码语言:javascript
复制
e1~belnr    e1~belzeile e2~geraet   e2~belzeile
1           1           A           1
1           2           A           2
1           4           B           5
1           5           B           5
1           7           A           8
1          22           A           23

然而,我想要实现的是

代码语言:javascript
复制
e1~belnr    e1~belzeile e2~geraet   e2~belzeile
1           1           A           1
1           2           A           2
1           4           *A*         *2*
1           5           B           5
1           7           *B*         *5*
1          22           A           23

在伪码中:

代码语言:javascript
复制
Loop through e1 (sorted in ascending ordered by belzeile)
Assign each row of e1 the row of e2 which has the same belzeile.
If no such row exist, assign the "previous" (by belzeile) row.

e2~belzeile在最终结果中并不是真正需要的,只是为了演示目的。

这里有一个小提琴:http://sqlfiddle.com/#!9/e22c7d0/1

有什么想法吗?

请注意,LEAD允许的比ABAP OpenSQL更多,即某些语句(最重要的是连接条件中的子查询、select语句或延迟/引导函数中的子查询)在OpenSQL中不受支持。完整的ABAP OpenSQL文档有所有的限制,因为阅读它有点让人望而生畏,我鼓励您只提出在“普通”DB不可知论SQL中工作的好建议,我将检查它们是否也适用于ABAP OpenSQL。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-01 19:25:08

代码语言:javascript
复制
SELECT e1~belnr    AS e1_belnr,
       e1~belzeile AS e1_belzeile,
       e2~geraet   AS e2_geraet,
       e2~belzeile AS e2_belzeile
  FROM dberchz1 AS e1
  LEFT OUTER JOIN dberchz2 AS e2
    ON e1~belnr = e2~belnr
  WHERE e2~belzeile = (
    SELECT MAX( s~belzeile ) AS e2_belzeile
      FROM dberchz2 AS s
      WHERE s~belnr = e1~belnr
        AND s~belzeile <= e1~belzeile )
  INTO TABLE @rt_result.

最后一行实际上是(1,22,A,8),而不是(1,22,A,23),因为您加入了前一行。

我忽略了添加到语句中的附加geraet <> '',因为您在文本描述中没有提到它;您可以根据需要添加它。

但是,请注意,这看起来非常麻烦。如果可能的话,我建议您编写一个脚本化的数据库视图。

在SAPHANA2.0上的NW 7.52 SP03系统上验证。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51639083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档