使用其他表中的随机值更新SQL表

Mar*_*nHN 13 sql-server

在Microsoft SQL Server 2008上,我有一个包含Products的表:

Id | 名称| DefaultImageId

一个有图像:

Id | ProductId | 字节

我想运行一个Update语句,它更新Products表中所有记录的DefaultImageId,其中Images表中的随机ID通过ProductId列与Product相关.

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

jac*_*ert 15

用选定的答案解决@ 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    
Run Code Online (Sandbox Code Playgroud)

  • 这解决了我在每行获取相同随机数的问题.需要"where t1.Id = t1.Id"才能使其正常工作,我最初没有注意到它,尽管交叉应用是接受的答案与此答案之间的唯一区别. (3认同)

Rob*_*Day 10

您可以在NEWID上执行订单,以获取更新的每一行的随机数.

UPDATE
    Products
SET
    DefaultImageId =
    (
        SELECT TOP 1
            Id
        FROM
            Images
        WHERE
            Images.ProductId = Products.Id
        ORDER BY
            NEWID()
    )
Run Code Online (Sandbox Code Playgroud)

这已被标记下来并添加了评论,表明它没有解决问题.我认为混淆来自人们尚未意识到原始问题请求为每个产品选择随机图像,因此带有产品ID的where子句.已提供包含以下数据集的完整脚本.它为每种产品增加了五种产品和三种图像.然后随机设置每个产品的默认图像ID.

CREATE TABLE Products(Id INT, Name NVARCHAR(100), DefaultImageId INT NULL)

CREATE TABLE Images (Id INT, ProductId INT, Bytes VARBINARY(100))

INSERT INTO Products (Id, NAME, DefaultImageId) VALUES(1, 'A', NULL)
INSERT INTO Products (Id, NAME, DefaultImageId) VALUES(2, 'B', NULL)
INSERT INTO Products (Id, NAME, DefaultImageId) VALUES(3, 'C', NULL)
INSERT INTO Products (Id, NAME, DefaultImageId) VALUES(4, 'D', NULL)
INSERT INTO Products (Id, NAME, DefaultImageId) VALUES(5, 'E', NULL)

INSERT INTO Images (Id, ProductId, Bytes) VALUES(1, 1, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(2, 1, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(3, 1, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(4, 2, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(5, 2, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(6, 2, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(7, 3, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(8, 3, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(9, 3, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(10, 4, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(11, 4, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(12, 4, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(13, 5, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(14, 5, NULL)
INSERT INTO Images (Id, ProductId, Bytes) VALUES(15, 5, NULL)

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

SELECT * FROM Products
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案似乎为每个正在更新的行分配相同的随机选择值.有没有办法为每个要更新的行分配从源表中随机选择的不同值(示例中的图像)? (13认同)

小智 5

另一种可能的解决方案

UPDATE
    Products
SET
    DefaultImageId =
    (
        SELECT TOP 1
            Id
        FROM
            Images
        ORDER BY
            NEWID(), Products.Id
    )
Run Code Online (Sandbox Code Playgroud)