我的查询原本是这样的:
select a.ID, a.TransactionID, b.Result
from MyDB.Result a inner join MyDB.ResultData b on a.ID=b.ID
where a.ID < 100000 and a.CreatedOn > '2020-01-01'
order by a.ID
但是我在Elasticsearch JDBC输入中遇到了错误
除非还指定了TOP,OFFSET或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效。
要解决这个问题,我将其重构为:
select TOP 500 a.ID, a.TransactionID, b.Result
from MyDB.Result a inner join MyDB.ResultData b on a.ID=b.ID
where a.ID < 100000 and a.CreatedOn > '2020-01-01'
order by a.ID
有什么办法可以重写它,而不必要求TOP 500,而是让JDBC插件使用其内置设置?
编辑: 这是日志中的一部分。看起来确实是作为较大查询的一部分来运行。
(1.251403s) SELECT TOP (1) count(*) AS [COUNT] FROM (select TOP 500 a.ID, a.TransactionID, b.Result from MyDB.Result a inner join MyDB.ResultData b on a.ID=b.ResultID where a.ID < 100000 and a.CreatedOn > '2020-01-01' order by a.ID) AS [T1]
(8.845048s) SELECT * FROM (select TOP 500 a.ID, a.TransactionID, b.Result from MyDB.Result a inner join MyDB.ResultData b on a.ID=b.ResultID where a.ID < 100000 and a.CreatedOn > '2020-01-01' order by a.ID) AS [T1] ORDER BY 1 OFFSET 0 ROWS FETCH NEXT 500 ROWS ONLY
答案 0 :(得分:0)
在将TOP子句用作FROM的子查询时,需要ORDER BY。
子查询规则
仅在还指定了TOP的情况下才能指定ORDER BY。
您可以做的是,可以将ORDER BY移到FROM子句之外。我了解您希望所有的行,而不是仅500行。
(1.251403s) SELECT TOP (1) count(*) AS [COUNT] FROM (select a.ID,
a.TransactionID, b.Result from MyDB.Result a inner join MyDB.ResultData b
on a.ID=b.ResultID where a.ID < 100000 and a.CreatedOn > '2020-01-01') AS [T1]
order by ID
(8.845048s) SELECT * FROM (select a.ID, a.TransactionID, b.Result from MyDB.Result a
inner join MyDB.ResultData b on a.ID=b.ResultID where a.ID < 100000
and a.CreatedOn > '2020-01-01' order by a.ID) AS [T1] ORDER BY ID