ORA: 01467 Ключ сортировки слишком длинный - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь найти исходное значение для строки, комбинируя студенческую историю и студенческую таблицу. Я должен создать динамический запрос c, который выбирает столбец во время выполнения из таблицы ученика с различными схемами. Когда я выполняю приведенный ниже запрос с более чем 90 столбцами, он выдает ошибку «ORA-01467»


select sh.id,
       coalesce(sh.name,
                lag(sh.name ignore nulls) over (partition by sh.id order by sh.DatetimeCreated),
                s.name
               ) as name,
       coalesce(sh.city,
                lag(sh.city ignore nulls) over (partition by sh.id order by sh.DatetimeCreated),
                s.city
               ) as city,
       coalesce(sh.address,
                lag(sh.address ignore nulls) over (partition by sh.id order by sh.DatetimeCreated),
                s.address
               ) as address,
        s.createdDateTime,
        sh.createdDateTime as updatedDateTime,
Coalesce(sh.column1, lag(sh.column1)over(partition by sh.id order by sh.DatetimeCreated desc), s.column1) as column1,
from studenthistory sh join
     student s
     on s.id = sh.id
union all
select s.id, s.name, s.city, s.address, s.createdDateTime, s.updatedDateTime
from student s;

1 Ответ

1 голос
/ 21 января 2020

Это известное ограничение в Oracle.

Согласно Oracle документам, причина и разрешение для ORA-01467 составляет

Причина: Операция DISTINCT, GROUP BY, ORDER BY или SET требует, чтобы ключ сортировки был длиннее, чем тот, который поддерживается Oracle. В операторе SELECT указано слишком много столбцов или слишком много групповых функций.

Действие: Уменьшите число столбцов или групповых функций, участвующих в операции.

В вашем запросе 90 столбцов, которые могут превышать размер блока вашей БД.

Для этой проблемы не существует обходного пути, кроме как уменьшить количество столбцов, чтобы данные эти столбцы должны соответствовать одному блоку.

Cheers !!

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