我的查询原本是这样的。
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输入中得到了错误的信息。
ORDER BY子句在视图、内联函数、派生表、子查询和普通表表达式中无效,除非同时指定了TOP、OFFSET或FOR XML。
为了解决这个问题,我把它重构成这样。
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插件使用它的内置设置?
EDIT.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET.NET:这是日志中的一部分 这看起来确实是作为一个更大的查询的一部分在运行。
(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
当你使用TOP子句作为FROM时,需要使用ORDER BY。
子查询规则
ORDER BY只能在指定了TOP时才能指定。
你可以做的是,你可以把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
你可以尝试用 order by a.ID offset 0 rows