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

Equivalent to subquery without TOP or ORDER BY in HANA SQL

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

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不止一行

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

编辑:
列 "notes_extra" 是 NCLOB 类型似乎增加了问题。我尝试想出的任何替代方案都会在本专栏的聚合函数 (MAX, FIRST_VALUE, ...) 的某个点结束,结果是:SAP DBTech JDBC: [264]:无效的数据类型:聚合函数中的 LOB 类型

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

您根本不需要子 select,请改用 window function

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";

"I don't care" 不是数据库擅长处理的东西。如果没有实际决定取哪一行的选项,那么数据模型根本不适合回答这个问题。

 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;

可以按照一般排序,将订单评论的倒数第二条送达。请注意,这会提供与初始查询相同的默认打破平局行为,即:任意。

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

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