有没有办法在ABAP的OpenSQL中简化选择列,JOIN
当我想要获取一个表的所有字段但只选择其他表中的选定字段时?
例如,在mysql中我们可以简单地做到:
SELECT tb1.*, tb2.b, tb2.d
FROM tableA tb1
INNER JOIN tableB tb2 ON tb1.x = tb2.a
Run Code Online (Sandbox Code Playgroud)
但是,OpenSQL似乎不允许选择tb1~*, tb2~b, tb2~d
所以我必须诉诸于此:
SELECT tb1.x, tb1.y, tb1.z, tb2.b, tb2.d
FROM tableA tb1
INNER JOIN tableB tb2 ON tb1.x = tb2.a
Run Code Online (Sandbox Code Playgroud)
对于非常大的表,尤其是标准表,这变得难以处理,难以阅读且维护起来更烦人.
有没有更好的方法来选择tb1的所有字段和tb2中的某些字段?
在 ABAP SQL 中,我可以在比较WHERE
a的子句中的字段时忽略这种情况SELECT
吗?
SELECT *
FROM some_table
WHERE field1 = variable1.
Run Code Online (Sandbox Code Playgroud)
我如何比较field1
,以variable1
忽略不同的情况下?
假设我有一个表示层次结构的数据库表,其中包含以下列:
从给定的ID开始,我必须能够检索所有子节点(不仅是直接子节点).由于ABAP中没有公用表表达式(WITH RECURSIVE),解决此问题的最佳方法是什么?
我想到的一个可能的解决方案是迭代结果集(LOOP或使用游标),并递归调用一个检索直接子节点的函数.但是,我希望有一种更优雅的方法.
在SQL中,通常可以在select语句中使用文字,例如像这样
SELECT 'I', 'EQ', table.alev_uuid
FROM table
Run Code Online (Sandbox Code Playgroud)
有没有机会在ABAP SQL查询中执行此操作?
到目前为止我尝试过的是:
DATA lt_aldf TYPE RANGE OF cam_pw_stat-alev_uuid .
DATA lv_i type string value 'I'.
DATA lv_eq type string value 'EQ'.
SELECT lv_i lv_eq alev~alev_uuid
FROM cam_tool AS tool INNER JOIN
cam_alev AS alev ON tool~tool_uuid = alev~tool_uuid
INTO TABLE lt_aldf
WHERE tool_access = /a1sspc/if_cam_tool=>gc_tool_definition-hdb-class AND
tool~active = abap_true AND
alev~active = abap_true.
Run Code Online (Sandbox Code Playgroud)
但它不像通常的SQL标准那样工作.有人有建议吗?
excep_point
我想从透明表中获取 a 字段,z_accounts
用于company_code
和的组合account_number
。我怎样才能在ABAP SQL 中做到这一点?
假设表结构为
|company_code | account_number | excep_point |
Run Code Online (Sandbox Code Playgroud) 我想对具有 6 个关键字段的数据库表执行 SELECT 查询,假设它们是 keyA、keyB、...、keyF。
作为我的 ABAP 功能模块的输入参数,我确实收到了一个具有关键字段结构的内部表,因此该内部表中的每个条目对应于数据库表中的一个元组。
因此,我只需要从数据库表中选择与我的内部表中的条目相对应的所有元组。此外,我想在完全相同的查询中聚合该数据库表中的金额列。
在伪 SQL 中,查询将如下所示:SELECT SUM(amount) FROM table WHERE (keyA, keyB, keyC, keyD, keyE, keyF) IN {internal table}。
但是,这种表示在 ABAP OpenSQL 中是不可能的。
只允许声明一列(例如 keyA),而不是组合键。此外,我只能在关键字 IN 后使用“选择表”(带有 SIGN、OPTIOn、LOW、HIGH 的那些)。使用 FOR ALL ENTRIES 似乎可行,但是在这种情况下我不能使用 SUM,因为在同一查询中不允许聚合。
有什么建议?
我正在使用 5 个参数从数据库表(mara, makt, marc, mard)中获取详细信息。
PARAMETERS :number TYPE matnr MATCHCODE OBJECT MAT1 ,
type TYPE MTART MATCHCODE OBJECT H_T134 ,
sector TYPE MBRSH MATCHCODE OBJECT H_T137 ,
group TYPE MATKL MATCHCODE OBJECT H_T023 ,
unit TYPE MEINS MATCHCODE OBJECT H_T006 .
Run Code Online (Sandbox Code Playgroud)
首先,我尝试使用选择查询从MARA表中获取数据。为了检索特定记录,我必须使用WHERE条件。但我对条件部分感到困惑。我们可以使用INITIAL条件检查哪个参数具有值。
但是 2/3/4/5 参数有可能具有值。对于每种情况,我们都必须编写选择查询(如果是这样会导致性能问题),或者有什么方法可以在选择查询中使用动态条件部分?
列ADRNRA中的值在表ADRC中具有匹配的行.
在这种情况下,我找到了ADRC,因为有人告诉我解决方案.
也许我是盲人,但看起来AUFK-ADRNRA并不是明确的外键.
有没有办法进行内省并找到匹配的相关表(在本例中为ADRC)与脚本或SQL?
此 ABAP 代码有效:
select *
into table <sub_result>
from ADRC
WHERE ADDRNUMBER
in ( select ADRNRA from AUFK where (cond_string) ).
Run Code Online (Sandbox Code Playgroud)
但这不会:
select *
into table <sub_result>
from ADRC
WHERE (ADDRNUMBER, MANDT)
in ( select ADRNRA, MANDT from AUFK where (cond_string) ).
Run Code Online (Sandbox Code Playgroud)
AFAIK元组语法(ADDRNUMBER, MANDT)
对SQL有效。这在 ABAP 的 Open SQL 中无效吗?
如果不允许元组语法,我该怎么办?
PS在 Open SQL 中不需要检查 MANDT,所以这只是示例查询。
有没有办法获得当前用户可以看到的所有BUKRS列表?
我想在open sql中使用此列表作为过滤器.想象一下我搜索存储结果的方法的结果bk_list
.然后我可以bk_list
像这样使用:
SELECT * FROM some_table WHERE bukrs IN bk_list
Run Code Online (Sandbox Code Playgroud)