相当于 HANA SQL 中没有 TOP 或 ORDER BY 的子查询

Equivalent to subquery without TOP or ORDER BY in HANA SQL

SAP SQL 转换器给了我这个作为输出:

1
2
3
4
5
6
7
SELECT c."id", c."key_link",
    (SELECT TOP 1"notes_extra"
    FROM"Orders" c2
    WHERE c2."id" = c."id" AND c2."start" < c."start"
    ORDER BY c2."start" DESC) AS"previous_notes"
FROM"Orders" c
ORDER BY c."id";

很遗憾,SAP HANA SPS 10 不接受它:
SAP DBTech JDBC:[309]:相关子查询不能有 TOP 或 ORDER BY

我正在努力将查询转换为没有 TOP 和 ORDER BY 的内容。用 WHERE"start" = (SELECT MAX("start") 尝试了一些事情,但由于 "start" 可能有重复的值,我最终得到: SAP DBTech JDBC: [305]: single-row query returns more than one row

那么在 HANA SQL 中正确的等价物是什么?

编辑:"notes_extra"列的类型为 NCLOB 似乎增加了问题。我尝试在此列上的聚合函数(MAX,FIRST_VALUE,...)中的某个点提出任何替代方案,这会导致:SAP DBTech JDBC:[264]:无效数据类型:LOB 聚合函数中的类型


"我不在乎"不是数据库擅长处理的事情。如果没有选项来实际决定取哪一行,那么数据模型根本不适合回答这个问题。

1
2
3
4
5
6
7
 SELECT"id","notes_extra" FROM
     (SELECT c."id", c."notes_extra"
            , ROW_NUMBER () OVER
               (partition BY c."id"
                ORDER BY c."id" ASC , c."start" DESC) AS RN
      FROM orders c )
  WHERE rn =2;

可以根据一般排序送出倒数第二的订单评论。请注意,这提供了与您的初始查询相同的默认平局破坏行为,即:任意。


您根本不需要子选择,而是使用窗口函数:

1
2
3
4
SELECT c."id", c."key_link",
       lag(c."notes_extra") OVER (partition BY c."id" ORDER BY c."start" DESC) AS"previous_notes"
FROM"Orders" c
ORDER BY c."id";


您现在可以为此使用 FIRST_VALUE() 函数,如:

SELECT (FIRST_VALUE(col ORDER BY col) FROM ... WHERE ...) AS ...


如果您仅按给定的排序顺序查找"第一"列,则始终可以使用 max()/min() 聚合。不确定您遇到了什么问题,但这绝对是可能的。
但是,根据您的要求,我建议在 SQL 视图中实现逻辑(并将其与您的主查询连接)或作为表 udf。