在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)
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)
小智 5
另一种可能的解决方案
UPDATE
Products
SET
DefaultImageId =
(
SELECT TOP 1
Id
FROM
Images
ORDER BY
NEWID(), Products.Id
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13168 次 |
| 最近记录: |