- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在处理一个包含几个表的数据库。他们是一个
districts table
PK district_id
student_data table
PK study_id
FK district_id
ga_data table
PK study_id
district_id
ga_data表是我加入的数据。student_data表和ga_data表都有130万条记录。 study_id 在两个表之间是 1 到 1,但是 ga_data.district_id 是 NULL,需要更新。我在使用以下 PL/SQL 时遇到问题:
update ga_data
set district_id = (select district_id from student_data
where student_data.study_id = ga_data.study_id)
where ga_data.district_id is null and rownum < 100;
我需要逐步完成,所以这就是我需要 rownum 的原因。但我是否正确使用它?多次运行查询后,它只更新了 130 万条记录中的大约 8,000 条记录(应该是大约 110 万条更新,因为一些 district_ids 在 student_data 中为空)。谢谢!
最佳答案
ROWNUM 只是在前 n 行之后截断查询。您在 STUDENT_DATA 中有一些行的 DISTRICT_ID 为 NULL。因此,在多次运行之后,您的查询很可能会陷入困境,返回相同的 100 个 QA_DATA 记录,所有这些记录都与那些讨厌的 STUDENT_DATA 行之一匹配。
因此,您需要某种机制来确保您在 QA_DATA 表中按自己的方式逐步工作。标志列是一种解决方案。对查询进行分区以使其命中一组不同的 STUDENT_ID 是另一回事。
不清楚为什么必须以 100 个为一组执行此操作,但最简单的方法可能是使用 BULK PROCESSING(至少在 Oracle 中:此 PL/SQL 语法在 MySQL 中不起作用)。
这里是一些测试数据:
SQL> select district_id, count(*)
2 from student_data
3 group by district_id
4 /
DISTRICT_ID COUNT(*)
----------- ----------
7369 192
7499 190
7521 192
7566 190
7654 192
7698 191
7782 191
7788 191
7839 191
7844 192
7876 191
7900 192
7902 191
7934 192
8060 190
8061 193
8083 190
8084 193
8085 190
8100 193
8101 190
183
22 rows selected.
SQL> select district_id, count(*)
2 from qa_data
3 group by district_id
4 /
DISTRICT_ID COUNT(*)
----------- ----------
4200
SQL>
这个匿名 block 使用批量处理 LIMIT 子句将结果集批量分成 100 行的 block 。
SQL> declare
2 type qa_nt is table of qa_data%rowtype;
3 qa_recs qa_nt;
4
5 cursor c_qa is
6 select qa.student_id
7 , s.district_id
8 from qa_data qa
9 join student_data s
10 on (s.student_id = qa.student_id);
11 begin
12 open c_qa;
13
14 loop
15 fetch c_qa bulk collect into qa_recs limit 100;
16 exit when qa_recs.count() = 0;
17
18 for i in qa_recs.first()..qa_recs.last()
19 loop
20 update qa_data qt
21 set qt.district_id = qa_recs(i).district_id
22 where qt.student_id = qa_recs(i).student_id;
23 end loop;
24
25 end loop;
26 end;
27 /
PL/SQL procedure successfully completed.
SQL>
请注意,此构造允许我们在发布更新之前对选定的行进行额外处理。如果我们需要以编程方式应用复杂的修复,这会很方便。
如您所见,QA_DATA 中的数据现在与 STUDENT_DATA 中的数据相匹配
SQL> select district_id, count(*)
2 from qa_data
3 group by district_id
4 /
DISTRICT_ID COUNT(*)
----------- ----------
7369 192
7499 190
7521 192
7566 190
7654 192
7698 191
7782 191
7788 191
7839 191
7844 192
7876 191
7900 192
7902 191
7934 192
8060 190
8061 193
8083 190
8084 193
8085 190
8100 193
8101 190
183
22 rows selected.
SQL>
关于mysql - PL/SQL rownum 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5348433/
我在 MySQL 中有这个查询 SELECT @rownum:=@rownum+1 AS rownum, notifications_posts.from_user AS source, notifi
SET @rownum := -1; SELECT round(AVG(t.LAT_N),4) FROM ( SELECT @rownum := @rownum + 1 AS
我想知道 rowID 之间的区别和 rowNUM 以及如何在我们的表格中看到这两者。 当我执行此操作时: SELECT * FROM emp WHERE rownum=1 它返回一个查询,但是当我对
我正在查看一个 SQL 查询,它使用 Oracle 的 rownum 伪列来选择行号作为总行数的一部分: ROWNUM/(MAX(ROWNUM) OVER()) 我正在尝试使用通过 jOOQ 编写的查
这个问题在这里已经有了答案: 关闭 10 年前。 社区在 4 个月前 审查了是否重新打开此问题,然后将其关闭: 原始关闭原因未解决 Possible Duplicate: Rownum not wo
为什么以下查询返回“零”记录: SELECT * FROM 记录 WHERE rownum >= 5 AND rownum = 5 而以下查询返回正确的记录: SELECT * FROM 记录 WHE
最近我修复了一些错误:连接条件中有rownum。 像这样:在 t1.id=t2.id 和 rownum 10 总是返回 false。我不知道 ROWNUM<-666 在你的 JOIN 子句中是如何工作
select * from MYTABLE t where EQUIPMENT = 'KEYBOARD' and ROWNUM <= 2 or EQUIPMENT = 'MOUSE' and ROWN
所以我想在 Oracle DB 中选择一系列行。我需要这样做,因为我在表中有数百万行,我想将结果分页给用户(如果您知道在客户端执行此操作的另一种方法,如果重要,我正在使用 JavaFX,但我不认为通过
select * from Schem.Customer where cust='20' and cust_id >= '890127' and rownum between 1 and 2
我的表中有 6442670 条记录,我正在使用以下命令获取它们jdbctemplate 使用行号一次 1000000 个。以下是查询 select * from (select rowNum rn
select * from Schem.Customer where cust='20' and cust_id >= '890127' and rownum between 1 and 2
我有一个带有 group by 和 order by 子句的复杂查询,我需要一个排序的行号 (1...2...(n-1)...n) 与每一行一起返回。使用 ROWNUM(在通过查询的谓词阶段后但在查询
基本上,我想通过使用@rownum 显示表中的行数以及数据,它在第一页上工作得很好,但是当我们转到下一页时,我们又从第一行开始。 查询代码: $sql = "SELECT @rownum:=@rown
我有一个包含 10 000 个元素的表。 IQuerable query = dataRep.Get() .Query(); 我
如何返回特定范围的 ROWNUM值(value)观? 我正在尝试以下操作: select * from maps006 where rownum >49 and rownum 49 and r <
最近看oracle资料的时候,了解rownum的概念,以前只知道对数据库表进行简单的增删改查; 看到了rownum的概念后,突然想到了好多业务场景应该都可以适用的,比如在进行随机发奖的时候, 我
我正在尝试查看客户请求重新激活其 Internet 帐户的频率。 问题是,我们捕获一组有限的数据来分组。所以我的数据集如下。 我正在尝试从第一次创建重新激活请求到它第一次完成计算,一旦完成,完成请求完
我正在尝试查询以仅返回表中的最新行。 最初我在查询中使用了 max(id) 但是当我使用序列并且我的环境是聚集的时,我不能依赖序列作为它的顺序。 所以我决定根据创建时间排序并使用 rownum 选择顶
这是我当前代码的示例: DataSet = [1,2,3,4,5,6,7,8,9]. Sequence = [3,4,5,6]. ReducedDataSet = lists:foldl( fun(S
我是一名优秀的程序员,十分优秀!