ORA:01467 排序键太长

Posted

技术标签:

【中文标题】ORA:01467 排序键太长【英文标题】:ORA:01467 Sort key too long 【发布时间】:2020-01-21 07:19:39 【问题描述】:

我试图通过结合 studenthistory 和 student 表来找到行的原始值。 我必须创建动态查询,该查询在运行时从具有不同模式的学生表中选择列。 当我在下面执行超过 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;

【问题讨论】:

嗨@Purva,你有两个相同的查询和两个不同的问题? ***.com/questions/59836895/… 这能回答你的问题吗? Dynamic Sql in SQL developer 附带说明:您的数据库或查询错误。学生历史表应该有一个学生 ID,并且连接必须使用它:on s.id = sh.student_id。如果studenthistory.id实际上是学生ID,那么应该这样命名。如果不是,那么您将加入错误的列。 这是一个复杂的查询。它建议学生表仅包含初始数据,学生历史表包含自那时以来的所有单个更改,其中更改的列已设置,其他列为空。您的查询应该在他们的更改历史记录中显示每天的完整学生数据,直到代表当前数据的最后一个条目。在我看来,将当前数据保存在学生表中会更好,并且只有在您想查看何时设置特定值时才会查找历史表。 更正:对于每个更改日期,您都会显示 previous 值。因此初始数据显示两次;当前数据根本不显示。 【参考方案1】:

这是 Oracle 中的已知限制。

根据 Oracle 文档,ORA-01467 的原因和解决方法是

原因: DISTINCT、GROUP BY、ORDER BY 或 SET 操作需要 排序键比 Oracle 支持的更长。列太多 或者在 SELECT 语句中指定了太多的组函数。

行动:减少涉及的列或组函数的数量 操作。

您的查询中有 90 列可能超出了您的数据库的块大小

除了减少列数以使这些列的数据必须适合单个块之外,没有解决此问题的方法。

干杯!!

【讨论】:

以上是关于ORA:01467 排序键太长的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 错误 1071 阻止更改字符集/排序规则,“指定的键太长......”

php Laravel指定键太长了

Mysql::Error: 指定的键太长;最大密钥长度为 1000 字节

SQL 错误 #1071 - 指定的键太长;最大密钥长度为 767 字节

markdown SQLSTATE [42000]:迁移命令时指定的键太长错误

Mysql Entity Framework 问题 - 指定的键太长;最大密钥长度为 3072 字节