首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NEWID()函数更新表

使用NEWID()函数更新表
EN

Stack Overflow用户
提问于 2020-08-17 03:30:27
回答 5查看 751关注 0票数 0
代码语言:javascript
复制
CREATE TABLE Products(Id INT, Name CHAR(100), DefaultImageId INT NULL);

INSERT INTO Products (Id, Name, DefaultImageId) VALUES(1, 'A', NULL);
INSERT INTO Products (Id, Name, DefaultImageId) VALUES(2, 'A', NULL);
INSERT INTO Products (Id, Name, DefaultImageId) VALUES(3, 'A', NULL);
INSERT INTO Products (Id, Name, DefaultImageId) VALUES(4, 'A', NULL);
INSERT INTO Products (Id, Name, DefaultImageId) VALUES(5, 'A', NULL);
INSERT INTO Products (Id, Name, DefaultImageId) VALUES(1, 'B', NULL);
INSERT INTO Products (Id, Name, DefaultImageId) VALUES(2, 'B', NULL);
INSERT INTO Products (Id, Name, DefaultImageId) VALUES(3, 'B', NULL);

通常,我会像下面的脚本一样随机更新一个表。

代码语言:javascript
复制
update a
    set DefaultImageId=1
from Products as a
where name = 'A' 
and id in (
    select top 2 id
    from Products as b
    where a.name = b.name
    order by newid()
)

不过,我遇到了一些问题。它将更新多于/少于2行。为了调试,我尝试多次执行以下脚本。结果并不总是只有两个记录。如果我通过newid()删除订单,输出结果的数量将很好。这似乎是newid()中的问题。我该如何解决这个问题?谢谢

代码语言:javascript
复制
select * 
from Products as a
where name = 'A' 
and id in (
    select top 2 id
    from Products as b
    where a.name = b.name
    order by newid()
)
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-08-17 05:57:52

你可以试试这个:

代码语言:javascript
复制
UPDATE U SET DefaultImageId = 1
FROM(
      SELECT TOP 2 * FROM dbo.Products WHERE Name = 'A' ORDER BY NEWID()
) AS U

但是,如果您在内部查询中过滤掉DefaultImageId=1,那么它也会更好。您应该注意到,在这种情况下,内部查询可能生成少于2个记录。

代码语言:javascript
复制
UPDATE U SET DefaultImageId = 1
FROM(
      SELECT TOP 2 * FROM dbo.Products WHERE Name = 'A' AND DefaultImageId <> 1 ORDER BY NEWID()
) AS U
票数 0
EN

Stack Overflow用户

发布于 2020-08-17 03:42:35

就像这样

此查询随机选择2行。

代码语言:javascript
复制
with top_2_cte(id, [name]) as (
    select top 2 id, [name] 
    from Products 
    where name='A' 
    order by newid())
select a.* 
from Products a
     join
     top_2_cte ttc on a.Id=ttc.id
                      and a.[Name]=ttc.[name];

更新语句

代码语言:javascript
复制
;with top_2_cte(id, [name]) as (
    select top 2 id, [name] 
    from Products 
    where name='A' 
    order by newid())
update a
    set DefaultImageId=1
from Products a
     join
     top_2_cte ttc on a.Id=ttc.id
                      and a.[Name]=ttc.[name];
票数 0
EN

Stack Overflow用户

发布于 2020-08-17 06:14:16

我想你只是想找一个简单的JOIN

代码语言:javascript
复制
UPDATE A
SET DefaultImageId = 1
FROM Products A
JOIN 
  (
    SELECT TOP 2 Id, Name
    FROM Products B
    ORDER BY NEWID()
  ) B ON A.Id = B.Id AND A.Name = B.Name;

演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63444186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档