Как использовать Query of Queries в качестве подзапроса (Coldfusion)

Я хочу использовать запрос запросов в качестве подзапроса, но получаю синтаксическую ошибку: Encountered "(. Вот мой запрос (qHistoryData — мой объект запроса):

<cfquery dbtype="query">
    SELECT *
    FROM (
        SELECT 
            t2.*,
            ROW_NUMBER() OVER(
                PARTITION BY collectid
                ORDER BY update_on DESC
            ) AS seqnum
        FROM qHistoryData t2
    ) t
    WHERE t.seqnum = 1;
</cfquery>

person FlowLess10    schedule 28.10.2019    source источник
comment
Какую базу данных вы используете? Оракул? Кроме того, полная ошибка была бы хороша. Спасибо!   -  person VBoka    schedule 28.10.2019
comment
Это упрощенная версия вашего реального запроса? Это выглядит совершенно справедливо для меня.   -  person Andrew    schedule 28.10.2019
comment
@VBokšić Я использую Oracle, и моя ошибка: синтаксическая ошибка Query of Queries. Encountered "(. Я больше ничего не получаю как ошибку.   -  person FlowLess10    schedule 28.10.2019
comment
@Andrew Это настоящий запрос.   -  person FlowLess10    schedule 28.10.2019
comment
Ну, как сказал @Andrew, все выглядит нормально. Вот демонстрация: dbfiddle.uk/   -  person VBoka    schedule 28.10.2019
comment
Как вы на самом деле выполняете этот запрос?   -  person Andrew    schedule 28.10.2019
comment
Я использую запрос запросов coldfusion. Итак, qHistoryData — это переменная запроса от Coldfusion.   -  person FlowLess10    schedule 28.10.2019
comment
ROW_NUMBER() и OVER() не поддерживаются запросами запросов.   -  person Jason Holden    schedule 28.10.2019
comment
Как уже упоминалось, запрос запросов ColdFusion ограничен в возможностях SQL. Это не полноценная реализация. Вот ссылка, описывающая синтаксис и его ограничения   -  person Miguel-F    schedule 28.10.2019
comment
QoQ ОЧЕНЬ ограничен. Этот тип запроса очень прост в большинстве СУБД, и вы, скорее всего, сможете получить эти данные в своем исходном запросе без повторного обращения к базе данных. Чаще всего в QoQ нет необходимости, если вы знаете, как запросить данные у своей базы данных.   -  person Shawn    schedule 29.10.2019
comment
@Shawn Спасибо за этот совет. Я думаю, что мне удалось решить свою проблему сейчас без использования QoQ.   -  person FlowLess10    schedule 29.10.2019


Ответы (1)


Запрос запросов реализован полностью на уровне приложения ColdFusion (на Java) и не задействует базу данных, поэтому вы не можете использовать многие функции, доступные в базе данных.

Добавьте столбец в свой запрос qHistoryData, который вычисляет ROW_NUMBER() OVER( PARTITION BY collectid ORDER BY update_on DESC ) AS seqnum, а затем в своем запросе запросов вы можете сделать:

<cfquery dbtype = "query">
SELECT *
FROM   qHistoryData
WHERE  seqnum = 1;
</cfquery>

Другой вариант — вручную обработать объект запроса и удалить нежелательные ряды.

person MT0    schedule 28.10.2019
comment
Учитывая данные, которые уже есть у OP, это хороший способ получить желаемые результаты. Тем не менее, я все еще думаю, что это, вероятно, данные, которые могут быть возвращены из исходного запроса без необходимости нести накладные расходы QoQ. - person Shawn; 29.10.2019