加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

在SQL中更新n个随机行

发布时间:2020-12-12 07:49:40 所属栏目:MsSql教程 来源:网络整理
导读:我有一个大约有1000行的表.我必须将表中的一列(“X”)更新为’Y’表示n个ramdom行.为此我可以有以下查询 update xyz set X='Y' when m in ('SELECT m FROM (SELECT mFROM xyzorder by dbms_random.value) RNDM where rownum n+1); 是否有另一种有效的方法来编
我有一个大约有1000行的表.我必须将表中的一列(“X”)更新为’Y’表示n个ramdom行.为此我可以有以下查询
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行,你不应该真的担心效率(可能有一亿行).如果没有此表中的任何索引,您将无法执行全表扫描以选择随机记录.

[编辑:]“但如果有10万行怎么办”

嗯,这仍然是3个数量级,低于1亿.

我运行了以下内容:

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秒钟(没有正式计时,它只花了足够的时间眨眼).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读