Oracle отличается от одного столбца, возвращающего строку - PullRequest
0 голосов
/ 25 июня 2019

У меня есть конечная точка API, которая принимает различные аргументы для фильтрации по определенным столбцам. По этой причине я пытаюсь создать запрос, в который легко добавить произвольные фильтры к базовому запросу. По какой-то причине, если я использую:

SELECT "MY_VIEW".* 
FROM   "MY_VIEW" 
    -- Distinct on ID filter
    WHERE ID IN (SELECT Max(ID) 
    FROM  "MY_VIEW" 
    GROUP  BY ID) 
    -- Other arbitrary filters...
ORDER  BY "MY_VIEW"."NAME" DESC

У меня ужасная производительность, поэтому я начал использовать этот запрос:

SELECT * FROM "MY_VIEW"
     -- Distinct on ID filter
     LEFT JOIN(
        SELECT DISTINCT
        FIRST_VALUE("MY_VIEW"."ID")
          OVER(PARTITION BY "MY_VIEW"."UNIQUE_ID") as DISTINCT_ID 
        FROM  "MY_VIEW"
    ) d ON d.DISTINCT_ID = "MY_VIEW"."ID"
    -- Other arbitrary filters...
    ORDER  BY "MY_VIEW"."NAME" DESC
)

Однако, когда я оставляю соединение, он отбрасывает отчетливый фильтр.

Также я не могу использовать rowid, потому что это представление.

Представление является версионной таблицей.

Информация об индексе

УНИКАЛЬНОСТЬ | СТАТУС | INDEX_TYPE | ВРЕМЕННЫЙ | PARTITIONED | JOIN_INDEX | ОПОРЫ

NONUNIQUE | ДЕЙСТВИТЕЛЬНЫЙ | НОРМАЛЬНЫЙ | N | НЕТ | НЕТ | ID

УНИКАЛЬНЫЙ | ДЕЙСТВИТЕЛЬНЫЙ | НОРМАЛЬНЫЙ | N | НЕТ | НЕТ | UNIQUE_ID

НЕУНИКАЛЬНЫЙ | ДЕЙСТВИТЕЛЬНЫЙ | ДОМЕН | N | НЕТ | НЕТ | ИМЯ

1 Ответ

0 голосов
/ 25 июня 2019

У меня недостаточно репутации, чтобы оставить «комментарий», поэтому я опубликую его как «ответ». Ваш первый пример:

SELECT "MY_VIEW".* 
FROM   "MY_VIEW" 
    -- Distinct on ID filter
    WHERE ID IN (SELECT Max(ID) 
    FROM  "MY_VIEW" 
    GROUP  BY ID) 
    -- Other arbitrary filters...
ORDER  BY "MY_VIEW"."NAME" DESC

Но понимаете ли вы, что предложение "GROUP BY ID" сводит на нет влияние функции MAX () на ID? Другими словами, вы получите все строки, и МАКС будет вычисляться по идентификатору каждой строки, возвращаясь. , , идентификатор этой строки. Возможно попробуйте:

SELECT "MY_VIEW".* 
FROM   "MY_VIEW" 
    -- Distinct on ID filter
    WHERE ID IN (SELECT Max(ID) 
    FROM  "MY_VIEW") 
    -- Other arbitrary filters...
ORDER  BY "MY_VIEW"."NAME" DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...