Tôi có một loại MyType quy định như sau:Oracle SQL: sử dụng chức năng LAG với người dùng định nghĩa kiểu trả về "kiểu dữ liệu không phù hợp"
create or replace type MyType as varray(20000) of number(18);
Và một MyTable bảng quy định như sau:
create table MyTable (
id number(18) primary key
,widgets MyType
)
Tôi đang cố gắng chọn các tiện ích con cho mỗi hàng và hàng trước đó trong MyTable bằng cách sử dụng SQL sau:
select t.id
,lag(t.widgets,1) over (order by t.id) as widgets_previous
from MyTable t
order by t.id;
và tôi nhận được phản hồi:
ORA-00932: inconsistent datatypes: expected - got MYSCHEMA.MYTYPE
Nếu tôi chạy cùng một truy vấn bằng cách sử dụng cột loại varchar hoặc số thay vì MyType hoạt động tốt.
Loại cột trong hàng hiện tại và hàng trước đó của cột phải giống nhau vì vậy tôi chỉ có thể giả định nó là thứ liên quan đến loại do người dùng xác định.
Tôi có cần phải làm điều gì đó đặc biệt để sử dụng LAG với loại do người dùng xác định hay không LAG không hỗ trợ các loại do người dùng xác định? Nếu sau này, có bất kỳ chức năng tiện ích nào khác có thể cung cấp cùng một chức năng hoặc tôi có cần thực hiện một phép tự kết nối truyền thống để đạt được điều tương tự không?
tôi không thể kiểm tra điều này bản thân mình ngay bây giờ, không may, nhưng những gì xảy ra nếu bạn làm: 'lag (t.widgets, 1, dàn diễn viên (null như MyType)) qua (thứ tự bởi t.id) '? – Boneist
@Boneist - Tôi e rằng tôi vẫn nhận được phần ORA-00932 mặc dù, một ý tưởng tuyệt vời! – Pancho
Một cách khác để sử dụng bảng lồng nhau là tạo bảng và lưu trữ dữ liệu của bạn một cách rõ ràng, sau đó có một khóa từ bảng mới quay lại mytable (và sau đó sử dụng SQL để so sánh các tập dữ liệu). Nếu không, tự tham gia có lẽ là cách dễ nhất để thực hiện việc này (ví dụ: tìm id của hàng trước đó và tham gia vào id hiện tại) – Boneist