当前位置: 首页 > 面试题库 >

在SQL中更新n个随机行

陆星文
2023-03-14
问题内容

我有大约1000行的表。我必须将n个随机行的表中的column(“ X”)更新为’Y’。为此,我可以有以下查询

update xyz set X='Y' when m in (
'SELECT m FROM (SELECT m
FROM xyz
order by dbms_random.value
) RNDM 
where rownum < n+1);

是否有另一种有效的方式来编写此查询。该表没有索引。请帮忙?


问题答案:

我将使用ROWID:

UPDATE xyz SET x='Y' WHERE rowid IN (
    SELECT r FROM (
        SELECT ROWID r FROM xyz ORDER BY dbms_random.value
    ) RNDM WHERE rownum < n+1
)

我使用ROWID的实际原因并不是为了提高效率(它仍然会进行全表扫描)-如果列m不是唯一的,则您的SQL可能不会更新所需的行数。

只有1000行,您不必担心效率(也许有一亿行)。该表上没有任何索引,您将无法进行全表扫描以选择随机记录。

[编辑:] “但是如果有100,000行呢?”

嗯,这仍然比1亿个少3个数量级。

我执行以下操作:

create table xyz as select * from all_objects;

[在您的系统上创建了大约50,000行-未索引,就像您的表一样]

UPDATE xyz SET owner='Y' WHERE rowid IN (
     SELECT r FROM (
          SELECT ROWID r FROM xyz ORDER BY dbms_random.value
     ) RNDM WHERE rownum < 10000
);
commit;

这花费了大约1.5秒。可能是1秒,可能是3秒(不是正式计时,它只是花了足够的时间闪烁)。



 类似资料:
  • 问题内容: 我有一个包含约50,000行的SQL Server表。我想随机选择大约5,000行。我想到了一种复杂的方法,用“随机数”列创建一个临时表,将我的表复制到该表中,遍历该临时表并用来更新每一行,然后从该表中选择随机数列< 0.1。我正在寻找一种更简单的方法,如果可能的话,可以在一个语句中进行说明。 本文建议使用该功能。这看起来很有希望,但是我看不到如何可靠地选择一定百分比的行。 有人做过吗

  • 问题内容: 我有两张桌子。大约有80行,大约有1000万行。 我想使用中的随机行更新其中的所有行。我不希望所有行都显示同一行。是否可以更新并让它为要更新的每一行随机选择一个值? 这是我尝试过的方法,但是在每一行中都放置了相同的值。 **编辑 问题答案: 好的,我认为这是我编写的最奇怪的查询之一,而且我认为这样做的速度太慢了。但是试一试:

  • 问题内容: 如何使用MySQL在过去2周中使用随机日期更新列? 例如(代码实际上不起作用): 问题答案: 您可以使用以下表达式获得随机整数: 要获得i <= R <j范围内的随机整数R,请使用表达式 。例如,要获得7 <= R <12范围内的随机整数,可以使用以下语句: http://dev.mysql.com/doc/refman/5.1/en/mathematical- functions.h

  • 问题内容: 我不知道如何从条件实例中获取n个随机行: 那呢 我找不到使用Criteria API的任何文档 这是否意味着我应该改用HQL? 谢谢! 编辑:我通过以下方式获得行数: 如何获取索引介于0和max之间的n个随机行?再次感谢! 问题答案: 实际上,使用Criteria进行一些调整是可能的。方法如下: 任何Restrictions.sqlRestriction将添加关键字“和”;为了消除其影

  • 问题内容: 我有这样的查询: 但是我只想对前400名进行此操作。我尝试添加“ limit 0,400”(就像我在查询中那样),但这没有用。我进行了一些搜索,而mysql似乎不像SQL Server那样支持TOP(n)命令。 知道我该怎么做吗? 编辑:为了将来参考,我使用以下样式进行选择,效果很好: 但无论出于何种原因,在更新中它都不会与“ 0”一起使用。我会认为这种不一致和模棱两可的行为,但是哦。

  • 问题内容: 我正在努力寻找以下问题的最佳解决方案。假设我有一个像这样的表“ Table”: 我想为集合中的每个值选择:(’name1’,’name2’)10个随机唯一行。当然,可以像这样进行联合: 但是,如果我有100个唯一的名称,而我必须为其选择10个随机记录,则此查询将有点大。 提前非常感谢 问题答案: SQLFiddle演示