我最初的问题是:
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
有没有什么方法可以让我重写它,这样就不必要求排名前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
1条答案
按热度按时间ctehm74n1#
当您将top子句用作from的子查询时,它需要order by。
子查询规则
只有同时指定了top时才能指定order by。
阅读所有子查询规则
您可以做的是,您可以通过在from子句之外移动订单。我知道你想要所有的行,而不是只有500行。