【问题标题】:How to generate SQL Code to update 9k rows with values for one column如何生成 SQL 代码以使用一列的值更新 9k 行
【发布时间】:2023-03-28 13:05:01
【问题描述】:

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

请记住,有问题的表没有主键。

最好的选择是什么?

提前致谢。

【问题讨论】:

  • 您没有提供足够的信息。 9000 行是什么 - 它们是表中的所有行吗?还是随机选择的?或者他们是如何被识别的? “字段”的数据类型是什么(请改为“列”!) - NUMBER、DATE、VARCHAR2、...?您如何定义“最佳”?
  • IMO,您应该使用游标更新 9k 行。
  • @MarcGiroux,UPDATE 语句有什么问题吗?

标签: sql oracle random


【解决方案1】:

创建表以保存 9000 个随机数用于演示目的:

CREATE TABLE brianl.random
(
    VALUE   NUMBER
  , id      INTEGER
);

在表格中插入 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

用一条更新语句用随机值更新 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;

人们有时使用的另一种方法是从 all_objects 中进行选择。我个人不喜欢这种方法,因为我认为表格只应用于其规定的目的。如果您需要超过 all_objects 中的对象数量,这也是有缺陷的,在我使用的系统上是 82,009,

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;

【讨论】:

  • 嘟嘟:我只是在生成一个例子。我不知道为什么这是“生成行的可怕方式”。更新命令是在做什么。你认为更好的方法是什么?递归 CTE?对于 9000 行,这并不重要。
  • 这也是没有解释的代码。如果 OP 可以查看和编码并“弄清楚”,他们可能一开始就不会在这里。
  • 我们应该小心我们以身作则。任何事情都会比逐行插入更好。这不仅仅关乎性能,还关乎代码的不必要的复杂性以及选择 PL/SQL 而不是 SQL。我不想在任何情况下看到这样的代码。
  • Dudu,我非常不同意你说这是一个“坏”的例子。它简单易懂,而且由于单列只有 9000 条记录,因此性能不是问题。我宁愿菜鸟有一个易于理解的例子,也不愿有一个令人困惑但高效的代码。此外,不要仅仅批评哪个容易,而是提供一个替代方案。我刚刚编辑了我的回复以包括另外两个备选方案,你的呢? Tankendarkk 是正确的,当我们与新手打交道时,我应该包括 cmets(我已添加)。
猜你喜欢
  • 2016-07-08
  • 2021-12-09
  • 1970-01-01
  • 2021-01-14
  • 2021-08-18
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 2021-04-24
相关资源
最近更新 更多