我从遗留表(我没有设计)中提取数据来转换该数据以便在不同的应用程序中使用。这是截断表设计:
-- Create table
create table order
(
insert_timestamp TIMESTAMP(6) default systimestamp not null,
numeric_identity NUMBER not null,
my_data VARCHAR2(100) not null
)
-- Create/Recreate primary, unique and foreign key constraints
alter table order
add constraint order_pk primary key (numeric_identity, insert_timestamp);
这种原始结构背后的想法是,numeric_identity识别出一个特定的客户。最新订单将是具有给定客户的数字标识的最新插入时间戳值的订单。在这种特殊情况下,没有多个行具有相同的insert_timestamp值和numeric_identity值的实例。
我的任务是检索此遗留数据以进行转换。我编写了以下查询以撤回最新的唯一记录,因为旧记录无需转换:
select * from order t where t.insert_timestamp =
(select max(w.insert_timestamp) from order
where t.numeric_identity = w.numeric_identity);
这会拉回预期的数据集,但如果有多个行具有相同的insert_timestamp和numeric_identity,则可能会失败。有没有比我写的更好的查询来回收以这种方式设计的表中的唯一记录?
答案 0 :(得分:1)
编写此查询的另一种方法:
select *
from (select t.*, row_number() over (partition by numeric_identity order by insert_timestamp desc) rn
from order t)
where rn = 1
此外,当一行具有相同的insert_timestamp
和numeric_identity
时,您无法获得情况,因为您在这两列上有主键。