Не работает SQL запрос. Ошибка в платформе 3.3.2. Прошу исправить

Добрый день уважаемая компания Террасофт!!!

в террасофте Платформа 3.3.2.254 создал SQL запрос, (сервис запроса прилагаю). В результате при просмотре(средствами администратора) вижу и не могу исполнить следующий запрос:

SELECT
[SubQuery123].[ID] AS [ID],
[SubQuery123].[Date] AS [Date]
FROM
(SELECT
[tbl_Document].[ID] AS [ID],
[tbl_Document].[Date] AS [Date],
ROW_NUMBER() OVER (ORDER BY tbl_Document.Date DESC) AS [RowNum]
FROM
[dbo].[tbl_Document] AS [tbl_Document]) AS [SubQuery123]
WHERE(ROW_NUMBER() OVER (ORDER BY tbl_Document.Date DESC) = :RowNUMM)

а верный запрос должен быть такой:

SELECT
[SubQuery123].[ID] AS [ID],
[SubQuery123].[Date] AS [Date]
FROM
(SELECT
[tbl_Document].[ID] AS [ID],
[tbl_Document].[Date] AS [Date],
ROW_NUMBER() OVER (ORDER BY tbl_Document.Date DESC) AS [RowNum]
FROM
[dbo].[tbl_Document] AS [tbl_Document]) AS [SubQuery123]
WHERE([SubQuery123].[RowNum] = :RowNUMM)

именно так (как правильный вариант) все в Админке я и сделал. А террасофт неправильно при показе и в работе преобразовывает запрос. просьба исправить данную ошибку в платформе. Подобный запрос нам срочно требуется исполнить уже в ближайшее время. Спасибо!!!

Нравится

8 комментариев

Здравствуйте Михаил,
При использовании в качестве CompareFilter SQLTextColumn в Terrasoft подставляется его текст, даже в подзапросах.

К сожалению данный функционал не реализован на текущий момент, он будет реализован в Terrasoft 3.4.1

А сроки когда это планируется сделать. И по какой причине невозможно реализовать и исправить данную ошибку в 3.3.2?

А почему именно так?

Почему не устраивает select Top ... Order by Date desc ?

потому что Евгений требуется в запросе выбрать определенное количество записей. Данное количество предварительно должно быть отсортировано по дате. при этом какое количество требуется взять в итоговой выборке Неизвестная величина и вычисляется программно. поэтому и требуется подзапрос с колонкой ROW_NUMBER(). чтобы в результирующей выборке можно было с легкостью взять любое количество которое когда нибудь будет известно

Так перед открытием датасета можно указать свойство TOP селекта и датасет вернет нужное кол-во записей.

А если Селект следующий:

select *
from (select *
from tbl_Account
UNION ALL
select *
from tbl_Contact
UNION ALL
select
*
from tbl_Document
)

вопрос как тогда перед открытием датасете УКАЗАТЬ TOP у вложенного униона чтобы получилось так:

select *
from (select *
from tbl_Account
UNION ALL
select *
from tbl_Contact
UNION ALL
select TOP 20
*
from tbl_Document
)

вот для решения данного вопроса я и стал использывать ROW_NUMBER()

Михаил, создайте на уровне mssql представление с кастомной колонкой, а в Администраторе таблицу с таким названием как у представления, но сохраняйте физически в БД. Далее в запросе сможете оперировать кастомной колонкой как с обычной.

Конечно же, у ROW_NUMBER() есть свое назначение, и он облегчает ряд задач. Я предложил реализовать первый приведенный вами пример по-другому. Приведенный Вами пример выше, работать не будет т.к. у этих таблиц набор полей разный. Если же действительно Вам никак не обойтись без ROW_NUMBER(), то предложение Александра единственное решение на текущий момент.

Показать все комментарии