sql - Oracle SQL : using LAG function with user-defined-type returns "inconsistent datatypes"

标签 sql oracle function user-defined-types

我的类型 MyType 定义如下:

create or replace type MyType as varray(20000) of number(18);

还有一个表MyTable定义如下:

create table MyTable (
   id       number(18) primary key
  ,widgets  MyType
)

我尝试使用以下 SQL 为 MyTable 中的每一行及其逻辑上的前一行选择小部件:

select  t.id
       ,lag(t.widgets,1) over (order by t.id) as widgets_previous
from MyTable t
order by t.id;

我得到了回复:

ORA-00932: inconsistent datatypes: expected - got MYSCHEMA.MYTYPE

如果我使用 varchar 或 number 类型的列而不是 MyType 运行完全相同的查询,它可以正常工作。

当前行和前一行中列的类型必须相同,因此我只能假设它与用户定义的类型相关。

我是否需要做一些特殊的事情才能将 LAG 与用户定义的类型一起使用,或者 LAG 不支持用户定义的类型?如果是后者,是否有任何其他实用函数可以提供相同的功能,或者我是否需要进行传统的自连接才能实现相同的功能?

最佳答案

阅读完上述所有内容后,我选择以下作为实现我需要的最有效的方法:

select curr.id
      ,curr.widgets  as widgets
      ,prev.widgets  as previous_widgets
from (select  a.id                                      
             ,a.widgets
             ,lag(a.id,1) over (order by a.id)  as previous_id
      from mytable a
     ) curr
     left join mytable prev on (prev.id = curr.previous_id)
order by curr.id

即。滞后/自连接混合在数字字段上使用滞后,它不会提示识别连接条件。我认为它相当整洁,我得到了我想要的收藏。感谢大家提供的非常有用的意见。

关于sql - Oracle SQL : using LAG function with user-defined-type returns "inconsistent datatypes",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40913209/

相关文章:

sql - 如何统计组数?

sql - Linq to sql 双内连接语句

sql - Oracle 更新基于 2 个其他表的连接

sql - Oracle SQL 数据透视表

jQuery - on() 不起作用(简单示例)

c++ - 带有 istream& 参数 C++ 的函数

mysql - 如何编写一个可扩展的SQL来查找连续登录n天的用户

c# - Entity Framework - 如何检查表是否存在?

sql - 使用过程将表导出到 csv 文件(带有时间戳的 csv 名称)

java - 流口水功能