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 阻止更改字符集/排序规则,“指定的键太长......”
Mysql::Error: 指定的键太长;最大密钥长度为 1000 字节
SQL 错误 #1071 - 指定的键太长;最大密钥长度为 767 字节