我可以重写此SQL查询以避免“ ORDER BY子句无效”

时间:2020-06-19 02:48:41

标签: sql sql-server jdbc

我的查询原本是这样的:

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

1 个答案:

答案 0 :(得分:0)

在将TOP子句用作FROM的子查询时,需要ORDER BY。

子查询规则

仅在还指定了TOP的情况下才能指定ORDER BY。

Read about all subquery rules

您可以做的是,可以将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 
相关问题