如何生成SQL代码,用一列的值更新9k行

如何生成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

我需要用随机信息更新9000行的一个字段

请记住,所讨论的表没有主键

最好的选择是什么

提前感谢。

创建表格以容纳9000个随机数,以便演示:

在表中插入9000行

因为这是为了演示,所以我决定使用PL/SQL循环,因为即使您不熟悉PL/SQL,它也很容易理解。我可以很容易地使用一个通用的表表达式CTE,但是如果您不理解PL/SQL,您就不会理解CTE

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;