在没有 INNER JOIN 的选择中使用 table BSEG

Using the table BSEG in a selection without INNER JOIN

我正在尝试使用以下代码从 table BSEG 中选择字段 KOART

CONSTANTS: lc_d TYPE c VALUE 'D'.
    SELECT k~bukrs,
         k~belnr,
         k~budat,
         k~gjahr,
         k~buzei,
         k~kunnr,
         i~banks,
         i~bankl,
         i~bankn
    FROM bsid AS k
    INNER JOIN knbk AS i ON k~kunnr EQ i~kunnr
*    INNER JOIN bseg
    INTO TABLE @DATA(lt_data_knbk)
    WHERE k~bukrs IN @so_bukrs
    AND k~budat IN @so_budat
    AND k~blart IN @so_blart
*    AND bseg~koart = @lc_d.

通常我会为 table 使用内部连接语法,但由于 bseg 是一个簇 table,它不接受内部连接选项,因此我无法使用字段 koart.

请问有谁知道,如何把BSEG的字段KOART放在上面的选择中?

非常感谢您的帮助!

此次选择不需要 KOART。 KOART EQ 'D'表示customer postings,但是BSID只包含customer postings(看table的第三个字段是customer number)。

,在此特定用例中实际上不需要内部联接,因为 table BSID 无论如何只包含客户文档。

但如果在这里是必需的,那么您将有两个选择:

首先是切换到 SAP HANA 作为数据库后端,因为这样所有集群 table 都将转换为常规 table。由于 SAP 宣布他们将从 2027 年开始对支持其他数据库收取额外费用,并在 2030 年完全放弃对非 HANA 的支持,因此从长远来看,您将无法解决这个问题。但由于 HANA 转换涉及成本和计划工作,如果您今天.

遇到这个问题,这可能不是一个严肃的选择。

如果您需要一个临时解决方案,直到您需要 table HANA 转换,那么还有第二种选择。您可以使用带有 FOR ALL ENTRIES 条件的第二个 select 来解决此问题。

SELECT bukrs,
     belnr,
     budat,
     gjahr,
     buzei,
     kunnr,
  FROM bsid     
  INTO TABLE @DATA(lt_data_bsid)
  WHERE bukrs IN @so_bukrs
  AND budat IN @so_budat
  AND blart IN @so_blart.

IF lt_data_bsid IS NOT INITIAL.
  SELECT bukrs,
         belnr,
         gjahr,
         buzei
    FROM bseg
    INTO TABLE @DATA(lt_bseg)
    FOR ALL ENTRIES IN @lt_data_bsid
    WHERE bukrs = @lt_data_bsid-bukrs
      AND belnr = @lt_data_bsid-belnr
      AND gjahr = @lt_data_bsid-gjahr
      AND buzei = @lt_data_bsid-buzei
      AND koart = @lc_d.
         
ENDIF.

请注意,此方法存在一些问题:

  • 您现在有两个内部 table 中的数据,而不是一个,因此您可能需要执行几个 READ TABLELOOP AT... WHERE 来混淆数据在一起。
  • 两次 SELECT 而不是一次意味着到数据库服务器的两次网络往返而不是一次。您还会错过您的数据库可能能够为 JOIN 执行的大多数内部优化。这会增加程序的 运行 时间。
  • 第一个 SELECT 可能 return 大量您不需要的数据,因此您可能 运行 出现内存问题。您可以通过使用数据库游标 (OPEN CURSOR) 和 FETCH 数据包中的结果来解决这个问题。但这会进一步降低性能。
  • 在使用 FOR ALL ENTRIES 时不要忘记 IF itab1 IS NOT INITIAL 检查。直觉上,如果查找 table 为空,人们会假设根本没有收到任何数据库行。但实际上会发生的是,提到 FOR ALL ENTRIES table 的 WHERE 条件被完全忽略,你收到 all table koart = 'D'.

但是如果您必须与集群进行 JOIN-table,那么不幸的是没有其他选择。