2012-12-28 88 views
2

是否存在强制Oracle(在插入/更新/删除时)利用row_num分析函数分配行号的方法,以后可以通过简单调用rownumber = X?在Oracle数据库中强制内部行号以匹配row_num分析函数

示例代码来说明我的意思:

select foo,bar,baz 
    row_number() over (partition by bang order by some_date desc) rn 
from my_table 

上面的查询将基于分区子句指定的行号。

现在,当我询问,我想其中ROWNUMBER = XI可以这样做:

select foo,bar,baz 
from my_table 
where rownumber=1 

这样做的原因是为了避免查询开销,并且将其推回发生远不频频在DDL语句系统。所以我的问题,是这样的可能吗?

COMMENT

每一个新的插入/更新/删除可能会更新表的每一个 行......这是一个潜在的大量日志(和 锁定)的。如果您的数据基本上是静态的,那么每次加载或更新时都要重新生成一个rownumber。

如果我们删除了更新/删除的约束条件,并且我不相信这个推理在特定时间对象驱动的情况下仍然存在。

+0

每一个新的插入/更新/删除可能会更新表的每行......这是一个潜在的大量日志(和锁定)的。如果您的数据基本上是静态的,那么每次加载或更新时都会重新生成一个rownumber。 – Mat

+0

@Mat所以让我们删除更新和删除的约束。如果我只是插入,其中驱动力实际上是时间戳/日期,那么是什么? – Woot4Moo

+0

那么,你在做实际插入之前计算rownumber(对并发性有很多照顾)。 – Mat

回答

1

对于此方法的一个问题是,您只能有一个进程修改表或由partition-by子句定义的子集的一个子集。这是因为修改表的多个会话在提交之前无法看到其他人所做的更改。

但是,如果你可以通过锁定来解决这个限制,那么没有理由不能编码。只要插入值总是递增就会相对简单,但其他情况当然会更复杂,而且没有什么是我能想到的自动化。尽管我会犹豫提供详细的建议或编码样本。

+0

当然。按照我的说法,我将row_num函数的开销抵消到物化视图中。我正在考虑将这个过程强加给Oracle,以便数据库完成更少的工作。 – Woot4Moo

1
SELECT ename, deptno, rownum, rno 
    FROM (SELECT ename, deptno, row_number() OVER (Order By deptno) rno 
      FROM scott.emp 
     ORDER BY deptno) 
/
ENAME   DEPTNO  ROWNUM  RNO 
---------- ---------- ---------- ---------- 
CLARK    10   1   1 
KING    10   2   2 
MILLER    10   3   3 
JONES    20   4   4 
FORD    20   5   5 
ADAMS    20   6   6 
.... 

您可以将全部或部分价值 - 从外部选择部分删除不需要的:

INSERT INTO emp_test2 
(
SELECT ename, deptno, rownum row_num, rno 
    FROM (SELECT ename, deptno, row_number() OVER (Order By deptno) rno 
     FROM scott.emp 
    ORDER BY deptno) 
); 
+0

现在我该如何强制Oracle对插入进行维护?所以我不需要执行row_number函数? – Woot4Moo

+0

不知道你在问什么...... – Art

+0

我在插入时询问数据是在oracle之前,是否可以强制row_number函数针对插入函数运行以生成由该函数维护的排序 – Woot4Moo