greatest-n-per-group - 用连接替换相关子查询
问题描述
我想用等效的联接替换以下 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
然而,该提案
- 选择 MAX(值)
- 您的方案使用内部连接到第一个 CDS 视图
在我的情况下不起作用。
- tf.bis(和 tf.ab)需要在新视图的选择列表中,以将连接(新视图)的 rhs 限制在正确的时间范围内。
- 唉,可能有多个(非重叠)子时间框架(包含在 [tf.ab, tf.bis] 中)具有相同的 tf.tarifart。由于这些不能组合在一起,这会导致 rhs 上出现多行。
原始查询对此没有问题(没有连接 -> 没有笛卡尔积)。
我希望下面的小提琴(工作示例)能澄清一点:http ://sqlfiddle.com/#!9/8d1f48/3
鉴于这些限制,在我看来,等效连接确实是不可能的。建议甚至确认?
解决方案
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
翻译成英文,您似乎想确定一组文件的最高适用关税。
我会将其重构为单独的步骤:
确定所有适用的关税,即完全涵盖文档时间间隔的所有关税。这将成为您的第一个 CDS 视图,并且在我的答案中形成子查询。
确定所有文件的最高适用关税。这将形成您的第二个 CDS 视图,并在我的答案中形成外部查询。这个具有 MAX / GROUP BY 以将结果集减少到每个文档一个。
推荐阅读
- c# - 如何将“XX,XXX”替换为“XX XXX”?
- javascript - 在选择器中转义反斜杠
- java - 如何在没有任何背景的情况下使用 android 启动器图标
- oracle - Sqlldr tab delim 文件加载问题
- angular - 通过在 typescript 中调用方法打开 bootstrap 4 模态
- java - NoSuchMethodError 当不直接调用方法,而是服务方法时
- formula - 将整数值分配给相对值列表
- c# - 单元测试时无法调试 dll - 未命中断点且无法更改属性中的配置
- asp.net - 无法在 asp .net core signalR 中播放示例客户端到服务器流式传输示例
- sql-server - 选择查询逻辑sql server