Могу ли я переписать этот запрос SQL, чтобы избежать сообщения «Предложение ORDER BY недействительно» - PullRequest
0 голосов
/ 19 июня 2020

Изначально мой запрос был таким:

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 JDB C input

Предложение 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 и вместо этого позволить плагину JDB C использовать свои встроенные настройки?

EDIT: Это раздел из логов. Это выглядит как часть более крупного запроса.

(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 голосов
/ 19 июня 2020

Когда вы используете подзапрос с предложением 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...