针对设计糟糕的Oracle表的替代SQL查询

时间:2015-04-10 18:17:55

标签: sql oracle

我从遗留表(我没有设计)中提取数据来转换该数据以便在不同的应用程序中使用。这是截断表设计:

-- 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,则可能会失败。有没有比我写的更好的查询来回收以这种方式设计的表中的唯一记录?

1 个答案:

答案 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_timestampnumeric_identity时,您无法获得情况,因为您在这两列上有主键。