选择所有条目

时间:2012-02-26 11:28:54

标签: sql select sap abap

我试图在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.

请让我知道两个陈述中的区别。

希瓦

3 个答案:

答案 0 :(得分:4)

一些明显的差异:

  1. 不同的表格
  2. 不同的目标字段
  3. 第二个选择有语法问题:您使用form而不是from(我使用我的编辑更正了它)
  4. 其他差异:

    选择1.)在in子句中使用where。所以它使用select-options(或range - 对象)。

    for all entries in it_bkpf表示内部表it_bkpf包含您要选择的元素列表。换句话说:选择bseg中的所有条目,其中提交的belnr是内部表bseg的元素。

答案 1 :(得分:3)

您将通过 ST05 交易获得明确答案。

  • 您可以执行st05事务,选择跟踪SQL并激活 跟踪。
  • 之后运行您的代码。
  • 再次输入st05选择停用跟踪,然后查看跟踪结果。

在那里,您可以看到转发到数据库服务器的确切SQL代码。由于BSEG是聚簇表,因此无法使用直观的标题项连接来检索所需的财务运动信息。这只是因为有几个表包括BSEG存储在单个数据库表中,所以数据库服务器在技术上不能分离BSEG行并找到BSEG特定的字段来进行正确的连接。

因此,您可以在应用程序服务器上进行类似连接的构造。首先,您要从标头表(BKPF)中检索所有与标头相关的列。接下来执行SELECT ... FOR ALL ENTRIES IN ...时,应用程序服务器将占用标题行的一小部分(通常为5)并构造SQL查询以检索与该部分对应的项目包。接下来,所有这些部分将合并到单个内部表中。因此,如果您可以执行普通连接,那么将只有所需文档的项目。

答案 2 :(得分:2)

以下是我理解它的方式。这两个陈述可能会在另一个陈述之后执行:

  1. 第一个语句从bkpf表中选择几个条目。这些条目存储在内部表it_bkpf中(比如belnr 1,2,3)。

  2. 然后将这些条目中的每一个用作选择#2的一部分。 "对于所有条目"将表bseg中的belnr与第一个语句中的内部表it_bkpf中的belnr相匹配。然后将匹配的条目放入内部表it_bseg。

  3. 如果SQL#2中的where子句是where belnr in s_belnr(而不是所有条目的整体),那么您给出的示例几乎相同。只有当你需要it_bkpf的内容用于其他目的时,这才有意义。另一种典型情况是,如果使用某些程序逻辑确定for all entries子句中使用的内部表的内容,而不是直接从数据库中读取它。

    对于所有条目"一个#34;:确保for all entries中的内部表不为空 - 然后将选择from子句中的整个表。