如何生成SQL代码,用一列的值更新9k行
我需要用随机信息更新9000行的一个字段 请记住,所讨论的表没有主键 最好的选择是什么 提前感谢。创建表格以容纳9000个随机数,以便演示: 在表中插入9000行 因为这是为了演示,所以我决定使用PL/SQL循环,因为即使您不熟悉PL/SQL,它也很容易理解。我可以很容易地使用一个通用的表表达式CTE,但是如果您不理解PL/SQL,您就不会理解CTE如何生成SQL代码,用一列的值更新9k行,sql,oracle,random,Sql,Oracle,Random,我需要用随机信息更新9000行的一个字段 请记住,所讨论的表没有主键 最好的选择是什么 提前感谢。创建表格以容纳9000个随机数,以便演示: 在表中插入9000行 因为这是为了演示,所以我决定使用PL/SQL循环,因为即使您不熟悉PL/SQL,它也很容易理解。我可以很容易地使用一个通用的表表达式CTE,但是如果您不理解PL/SQL,您就不会理解CTE DECLARE l_cnt INTEGER; BEGIN FOR i IN 1 .. 9000 LOOP
DECLARE
l_cnt INTEGER;
BEGIN
FOR i IN 1 .. 9000
LOOP
INSERT INTO random (id)
VALUES (i);
END LOOP;
COMMIT;
SELECT COUNT (*) c
INTO l_cnt
FROM random;
DBMS_OUTPUT.put_line ('-- '
|| TO_CHAR (SYSDATE, 'YYYY.MM.DD HH24:MI:SS')
|| ' count is: '
|| l_cnt);
END;
-- 2016.11.11 10:28:42 count is: 9000
使用单个Update语句使用随机值更新9000条记录
现在我们有了一个包含9000个值的表,我们可以根据请求更新9000个值
update random set value = dbms_random.value;
commit;
-您可以从我们提供的表中选择9000个随机值
为此目的而创建
select * from random;
创建表记录的PL/SQL替代方案
最后,有人评论说,PL/SQL对于创建我不同意的值来说是一种糟糕的做法,对我来说,它很简单,而且因为它是过程性的,对于初学者来说很容易理解,这里有一个执行相同功能的CTE。不要忘记在它完成执行后提交
INSERT INTO random (id)
WITH iset (num)
AS (SELECT 1
FROM DUAL
UNION ALL
SELECT num + 1
FROM iset
WHERE num < 9000)
SELECT *
FROM iset;
人们有时使用的另一种方法是从所有对象中进行选择。我个人不喜欢这种方法,因为我认为表格应该只用于它们声明的目的。如果您需要超过所有_对象中的对象数,这也是有缺陷的,我使用的系统上的对象数是82009
INSERT INTO random (id)
SELECT ROWNUM
FROM all_objects
WHERE ROWNUM <= 9000;
因此,在我正在创建这些演示的Oracle系统上,下面将只在表中插入82009行,而不是请求的100000行
INSERT INTO random (id)
SELECT ROWNUM
FROM all_objects
WHERE ROWNUM <= 100000;
你没有提供足够的信息。9000行是什么?它们都是表中的行吗?还是随机选择?或者如何识别它们?字段的数据类型是什么请改用column!-号码,日期,VARCHAR2?您如何定义最佳?在我看来,您应该使用游标来更新9k行。@MarcGiroux,UPDATE语句有什么问题吗?Dudu:我只是生成了一个示例。我不知道为什么这是一种生成行的糟糕方法。update命令正在执行此工作。你认为最好的方法是什么?递归CTE?对于9000行,这并不重要。这也是没有解释的代码。如果OP能够观察、编码并找出答案,他们可能一开始就不会在这里。我们应该注意我们通过示例教授的内容。任何事情都比逐行插入要好。这不仅关系到性能,还关系到代码不必要的复杂性,以及选择PL/SQL而不是SQL。我不想在任何情况下看到这样的代码。嘟嘟,我完全不同意你的观点,这是一个糟糕的例子。它简单易懂,而且因为一列上只有9000条记录,所以性能不是问题。我宁愿新手有一个易于理解的示例,而不是一段混乱但高效的代码。此外,提供一个替代方案,而不是简单地批评。我刚刚编辑了我的回复,加入了另外两个选项,你的呢?Tankendarkk是正确的,我应该在我们与新手打交道时添加我的评论。
INSERT INTO random (id)
SELECT ROWNUM
FROM all_objects
WHERE ROWNUM <= 100000;