是否可以重写此sql查询以避免“order by子句无效”

lymnna71  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(385)

我最初的问题是:

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
ctehm74n

ctehm74n1#

当您将top子句用作from的子查询时,它需要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

相关问题