【发布时间】:2014-07-23 19:18:11
【问题描述】:
我需要将 BKPF 和 BSEG 表中的一些数据压缩到一个表中。例如,假设决赛桌必须看起来像这样:
| BKPF-BUKRS | BKPF-GJAHR | BKPF-MONAT | BSEG-DMBTR |
|============|============|============|============|
| 01 | 2014 | 02 | 1,751.55 |
| 01 | 2014 | 02 | 526.45 |
| 02 | 2014 | 02 | 32,112.01 |
| | | | ...... |
|============|============|============|============|
为了使程序高效,我想使用 FOR ALL ENTRIES 语句。所以它看起来像这样:
SELECT BUKRS BELNR GJAHR MONAT
FROM BKPF
INTO CORRESPONDING FIELDS OF TABLE IT_BKPF
WHERE ....
IF IT_BKPF IS NOT INITIAL.
SELECT DMBTR
FROM BSEG
INTO CORRESPONDING FIELDS OF LS_BSEG
FOR ALL ENTRIES IN IT_BKPF
WHERE BUKRS = IT_BKPF-BUKRS AND
BELNR = IT_BKPF-BELNR AND
GJAHR = IT_BKPF-GJAHR.
LS_RESULT-BUKRS = LS_BSEG-BUKRS.
LS_RESULT-GJAHR = LS_BSEG-GJAHR.
LS_RESULT-MONAT = ???
LS_RESULT-DMBTR = LS_BSEG-DMBTR.
COLLECT LS_RESULT INTO IT_RESULT.
ENDSELECT.
ENDIF.
现在的问题是:如何获取每个条目的 BKPF-MONAT 值?有没有办法对所有条目做到这一点?另一种解决方案是两个 SELECT 循环,例如:
SELECT BUKRS BELNR GJAHR MONAT
FROM BKPF
INTO CORRESPONDING FIELDS OF LS_BKPF
WHERE ....
SELECT DMBTR
FROM BSEG
INTO CORRESPONDING FIELDS OF LS_BSEG
WHERE BUKRS = LS_BKPF-BUKRS AND
BELNR = LS_BKPF-BELNR AND
GJAHR = LS_BKPF-GJAHR.
LS_RESULT-BUKRS = LS_BKPF-BUKRS.
LS_RESULT-GJAHR = LS_BKPF-GJAHR.
LS_RESULT-MONAT = LS_BKPF-MONAT.
LS_RESULT-DMBTR = LS_BSEG-DMBTR.
COLLECT LS_RESULT INTO IT_RESULT.
ENDSELECT.
ENDSELECT.
但我认为这不是很有效.. 通常你会为此使用 JOIN,但 AFAIK 你不能使用集群表 (BSEG) 来做到这一点。
【问题讨论】:
-
您确定使用
FOR ALL ENTRIES会使程序更高效吗? -
@Jagger 如果你
FOR ALL ENTRIES-ing 所在的表是排序表类型,它会。 -
@RavenDreamer 我不太确定在这种情况下排序是否有帮助。看看这个 Open-SQL-Query 是如何实际转换为底层数据库的 SQL-Query 会很有趣。 Here 是一篇有趣的文章,它展示了 SQL Server 的外观。看起来有几个(取决于
FOR ALL ENTRIES表的大小)SELECT创建和统一的语句,在这种情况下排序没有帮助。 -
@Jagger 不排序表,type 排序表。除非传递“排序表”类型,否则数据库无法知道任何给定参数是否已排序(这可以导致更快更有效的查询)。
-
@RavenDreamer 正如我所说,由于语句被转换为 DB SQL 的方式,它是哪种表并不重要。