强制Oracle数据库中的内部行号与row_num分析函数匹配

时间:2012-12-28 15:27:47

标签: sql oracle oracle10g

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

用于说明我的意思的示例代码:

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

上述查询将根据partition子句分配行号。

现在,当我查询并且我想要rownumber = X时,我可以这样做:

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

这样做的原因是为了避免查询开销并将其推回到DDL语句中,这些语句在系统中的发生频率较低。那么我的问题又是这样的吗?

评论

  

每个新插入/更新/删除都可能会更新每个   你的桌子的一排...这可能是很多日志记录(和   锁定)。如果您的数据基本上是静态的,那么重新生成   每次加载或更新时都会显示rownumber。

如果我们删除更新/删除的约束,并且我不相信这种推理仍然存在,尤其是当一个临时对象是驱动它的时候。

3 个答案:

答案 0 :(得分:1)

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

但是,如果您可以通过锁定来应对此限制,那么就没有理由不能对此进行编码。只插入值总是递增的将是相对简单的,但其他情况当然会更复杂,没有一个是我能想到的自动。我会毫不犹豫地提供详细的建议或编码样本。

答案 1 :(得分: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)
);

答案 2 :(得分:0)

您打算创建PK_ID吗?如果是这样,请使用SEQUENCE。它会为你完成这项工作。

CREATE SEQUENCE - Oracle Documentation