相当于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 ...
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 ...