Результаты миграции запросов с Oracle на SQL Server приводят к следующему: предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах - PullRequest
0 голосов
/ 24 октября 2019

Следующий запрос Oracle необходимо перенести в T-SQL, но появляется следующая ошибка:

Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и общей таблицевыражений, если только не указаны TOP, OFFSET или FOR XML.

Oracle может обрабатывать приведенный ниже код без ошибок.

Удаление ORDER BY не помогает вообще.

SELECT CREATIONDATE, TITLE, SUM(myindex) over (ORDER BY CREATIONDATE ROWS UNBOUNDED PRECEDING) AS cumula
FROM (
SELECT CREATIONDATE, TITLE, 1 as myindex
FROM CONTENT
WHERE CONTENTID in (
        SELECT CONTENTID 
        FROM CONTENT_LABEL
        WHERE LABELID in (SELECT LABELID FROM LABEL WHERE name = 'retrospective')
)
AND CONTENTTYPE = 'PAGE'
AND CONTENT_STATUS = 'current'
ORDER BY CREATIONDATE)

Точная ошибка: предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и выражениях общих таблиц, если также не указаны TOP, OFFSET или FOR XML.

Можете ли вы помочь мне перенести запрос в SQL? Спасибо

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Вы столкнулись с двумя проблемами здесь.

1) Как отмечали некоторые другие, ORDER BY CREATIONDATE в подзапросе должно идти.

2) SQL Server (наряду с Postgres и, возможно, другими) требует, чтобы вы добавляли псевдоним подзапроса, когда он содержится в предложении FROM. Это синтаксическая ошибка, которую он выдает после того, как вы вынули ORDER BY. Вы можете назвать это как угодно. Когда мне все равно, по умолчанию 's', для «подзапроса».

SELECT CREATIONDATE, TITLE, SUM(myindex) over (ORDER BY CREATIONDATE ROWS UNBOUNDED PRECEDING) AS cumula
FROM 
(
SELECT CREATIONDATE, TITLE, 1 as myindex
FROM CONTENT
WHERE CONTENTID in 
        (
        SELECT CONTENTID 
        FROM CONTENT_LABEL
        WHERE LABELID in (SELECT LABELID FROM LABEL WHERE name = 'retrospective')
        )
AND CONTENTTYPE = 'PAGE'
AND CONTENT_STATUS = 'current'
/*ORDER BY CREATIONDATE*/
) AS s; --<--- Five extra characters, and you should be good to go.
0 голосов
/ 24 октября 2019

Как указано в сообщении об ошибке, вы не можете использовать ORDER BY для сортировки строк в производной таблице.

Порядок строк в наборе результатов контролируется предложением ORDER BY во внешнем SELECT, а не предложением OVER.

Предложение OVER "определяет логический порядок, в котором выполняется вычисление оконной функции". Он также не сортирует набор результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...