2009-08-17 91 views
8

随机值在Microsoft SQL Server 2008中,我有一个产品表:更新SQL表与其他表

ID |名称| DefaultImageId

而且一个与图片:

ID | ProductId |字节

我想运行一个Update语句,该语句使用ProductId列中与产品相关的Images表中的随机Id更新Products表中所有记录上的DefaultImageId。

任何人都可以帮忙吗?应该是任何SQL冠军(这显然不是我)简单...

回答

5

您可以通过NEWID进行订购,以获取每行更新的随机数。

UPDATE 
    Products 
SET 
    DefaultImageId = 
    (
     SELECT TOP 1 
      Id 
     FROM 
      Images 
     WHERE 
      Images.ProductId = Products.Id 
     ORDER BY 
      NEWID() 
    ) 
+11

此解决方案似乎将随机选择的值分配给每个正在更新的行。有没有一种方法来分配每一行更新与从源表中随机选择一个不同的值(在你的例子中的图像)? – philreed 2015-07-02 13:43:43

+0

请看看刚刚发布的解决方案是否解决了这个问题,@philreed – jacoblambert 2015-09-22 11:58:50

1

检查了这一点。

Update Products 
Set DefaultImageId = (
SELECT top 1 Id 
From Images 
Where 1=1 
and Products.Id = Images.ProductId 
ORDER BY NEWID() 
) 
+0

消息147,级别15,状态1,行2 聚合不应出现在WHERE子句中,除非它是在含有HAVING子句或选择列表在子查询中,并且列被聚集的是外部参考。 – MartinHN 2009-08-17 18:43:45

+0

我很抱歉,我纠正了它。 – 2009-08-17 18:47:11

3

另一种可能的解决方案

UPDATE 
    Products 
SET 
    DefaultImageId = 
    (
     SELECT TOP 1 
      Id 
     FROM 
      Images 
     ORDER BY 
      NEWID(), Products.Id 
    ) 
+0

太好了,如果图片表长度小于产品,这将不会保存空值。 – DevC 2015-08-11 17:31:24

0

试试这个(上的AdventureWorks):

它更新的人表的所有行从产品表中一个新的随机名称。

begin tran 
--show initial state: 
select top 25 * from person.person order by BusinessEntityID 

update person.person 
set 
FirstName = otherTable.Name 
from 
(select BusinessEntityID, row_number() over (order by newid()) as row_num from person.person) p2 
,(select ProductId, Name, row_number() over (order by newid()) as row_num from production.product) as otherTable 
where 
person.person.BusinessEntityID=p2.BusinessEntityID 
and (p2.row_num%500)=(otherTable.row_num%500) -- deal with tables with different rowcount 

--check results: 
select top 25 * from person.person order by BusinessEntityID 

rollback tran 

或者试用SQL小提琴类似的查询: http://sqlfiddle.com/#!3/8b719/1

7

寻址@ philreed的问题与选择的答案:

有没有用不同的更新来分配各行的方式从源表中随机选择的值 ?

UPDATE Products 
SET DefaultImageId = t2.Id 
FROM Products t1 
CROSS APPLY (
    SELECT TOP 1 Id 
    FROM Images 
    WHERE t1.Id = t1.Id 
    ORDER BY newid() 
    ) t2  
+0

这解决了我在每行上获取相同随机数的问题。需要“where t1.Id = t1.Id”才能使它工作,我最初没有注意到它,尽管交叉应用是被接受的答案和这个之间的唯一区别。 – 2017-12-09 16:18:42

+0

对于记录(没有双关语意图),这是不是非常高性能,如果对一个大ish数据集使用(我正在更新一个电话号码从10000个随机电话号码列表争夺一个300k成员的表,并且我目前在33分钟,想知道多长时间...) – jleach 2018-02-15 16:06:46

+0

也许你可以发布细节? – jacoblambert 2018-02-15 16:26:09