归结到基本问题,我有两个表
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。
有什么想法吗?
请注意,fiddle允许ABAP OpenSQL之外的其他语句,即ABAP OpenSSQL中不支持某些语句(例如,联接条件中或选择语句或LAG/LEAD函数中最重要的子查询(。这里是完整的ABAP OpenSQL文档,有所有限制https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapselect.htm由于通读它有点令人生畏,我鼓励您只提出在"普通"DB不可知SQL中工作的好建议,我会检查它们是否也在ABAP OpenSQL中工作。
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,2,A,23(,因为您加入了前一行。
我忽略了你在陈述中加入的额外geraet <> ''
,因为你在文本描述中没有提到它;根据需要随时添加。
然而,请注意,这看起来相当麻烦。如果可能的话,我建议编写一个脚本数据库视图。
在SAP HANA 2.0上的NW 7.52 SP03系统上进行了验证。