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