0

我想用等效的联接替换以下 ABAP OpenSQL 片段(在更大语句的 where 子句中)。

... AND tf~tarifart = ( SELECT MAX( tf2~tarifart ) FROM ertfnd AS tf2 WHERE tf2~tariftyp = e1~tariftyp AND tf2~bis >= e1~bis AND tf2~ab <= e1~ab ) ...

我的动机:查询迁移到 ABAP CDS 视图(基本上是纯 SQL,相比之下表达能力有所降低)。唉,不支持相关子查询和 EXISTS 语句。

我用谷歌搜索了一下,在这里找到了一个可能的解决方案(最后一篇文章)https://archive.sap.com/discussions/thread/3824523

然而,该提案

  1. 选择 MAX(值)
  2. 您的方案使用内部连接到第一个 CDS 视图

在我的情况下不起作用。

  1. tf.bis(和 tf.ab)需要在新视图的选择列表中,以将连接(新视图)的 rhs 限制在正确的时间范围内。
  2. 唉,可能有多个(非重叠)子时间框架(包含在 [tf.ab, tf.bis] 中)具有相同的 tf.tarifart。由于这些不能组合在一起,这会导致 rhs 上出现多行。

原始查询对此没有问题(没有连接 -> 没有笛卡尔积)。

我希望下面的小提琴(工作示例)能澄清一点:http ://sqlfiddle.com/#!9/8d1f48/3

鉴于这些限制,在我看来,等效连接确实是不可能的。建议甚至确认?

4

1 回答 1

1
select doc_belzart,
       doc_tariftyp,
       doc_ab,
       doc_bis,
       max(tar_tarifart)
  from 
  (
    select document.belzart as doc_belzart, 
           document.tariftyp as doc_tariftyp,  
           document.ab as doc_ab,
           document.bis as doc_bis, 
           tariff.tarifart as tar_tarifart,
           tariff.tariftyp as tar_tariftyp,
           tariff.ab as tar_ab,
           tariff.bis as tar_bis
      from dberchz1 as document
      inner join ertfnd as tariff
        on tariff.tariftyp = document.tariftyp and
           tariff.ab <= document.ab and
           tariff.bis >= document.bis
  ) as max_tariff
  group by doc_belzart,
          doc_tariftyp,
          doc_ab,
          doc_bis

翻译成英文,您似乎想确定一组文件的最高适用关税。

我会将其重构为单独的步骤:

  1. 确定所有适用的关税,即完全涵盖文档时间间隔的所有关税。这将成为您的第一个 CDS 视图,并且在我的答案中形成子查询。

  2. 确定所有文件的最高适用关税。这将形成您的第二个 CDS 视图,并在我的答案中形成外部查询。这个具有 MAX / GROUP BY 以将结果集减少到每个文档一个。

于 2018-09-24T11:13:24.943 回答