我试图在select语句中选择所有条目 - abap。我没有清楚地了解条目选择的内容。有人知道吗 ?
请看下面的陈述:
1
select bukrs belnr xblnr budat
from bkpf
into table it_bkpf
where belnr in s_belnr
2
select bukrs belnr buzei gsber zuonr wrbtr kunnr
from bseg
into table it_bseg
for all entries in it_bkpf
where belnr = it_bkpf-belnr.
请让我知道两个陈述中的区别。
希瓦
答案 0 :(得分:4)
一些明显的差异:
form
而不是from
(我使用我的编辑更正了它)其他差异:
选择1.)在in
子句中使用where
。所以它使用select-options
(或range
- 对象)。
for all entries in it_bkpf
表示内部表it_bkpf
包含您要选择的元素列表。换句话说:选择bseg中的所有条目,其中提交的belnr是内部表bseg的元素。
答案 1 :(得分:3)
您将通过 ST05 交易获得明确答案。
在那里,您可以看到转发到数据库服务器的确切SQL代码。由于BSEG是聚簇表,因此无法使用直观的标题项连接来检索所需的财务运动信息。这只是因为有几个表包括BSEG存储在单个数据库表中,所以数据库服务器在技术上不能分离BSEG行并找到BSEG特定的字段来进行正确的连接。
因此,您可以在应用程序服务器上进行类似连接的构造。首先,您要从标头表(BKPF)中检索所有与标头相关的列。接下来执行SELECT ... FOR ALL ENTRIES IN ...
时,应用程序服务器将占用标题行的一小部分(通常为5)并构造SQL查询以检索与该部分对应的项目包。接下来,所有这些部分将合并到单个内部表中。因此,如果您可以执行普通连接,那么将只有所需文档的项目。
答案 2 :(得分:2)
以下是我理解它的方式。这两个陈述可能会在另一个陈述之后执行:
第一个语句从bkpf表中选择几个条目。这些条目存储在内部表it_bkpf中(比如belnr 1,2,3)。
然后将这些条目中的每一个用作选择#2的一部分。 "对于所有条目"将表bseg中的belnr与第一个语句中的内部表it_bkpf中的belnr相匹配。然后将匹配的条目放入内部表it_bseg。
如果SQL#2中的where子句是where belnr in s_belnr
(而不是所有条目的整体),那么您给出的示例几乎相同。只有当你需要it_bkpf的内容用于其他目的时,这才有意义。另一种典型情况是,如果使用某些程序逻辑确定for all entries子句中使用的内部表的内容,而不是直接从数据库中读取它。
对于所有条目"一个#34;:确保for all entries
中的内部表不为空 - 然后将选择from子句中的整个表。