归结到基本问题上,我有两张桌子
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)
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 <> '' )收益率
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然而,我想要实现的是
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在伪码中:
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。
发布于 2018-08-01 19:25:08
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系统上验证。
https://stackoverflow.com/questions/51639083
复制相似问题