是否存在强制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。
如果我们删除更新/删除的约束,并且我不相信这种推理仍然存在,尤其是当一个临时对象是驱动它的时候。
答案 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。它会为你完成这项工作。