使用其他 table 中多个值的随机更新 table
Update table using random of multiple values in other table
考虑这个数据:
CREATE TABLE #Data (DataID INT, Code VARCHAR(2), Prefix VARCHAR(3))
INSERT INTO #Data (DataID, Code)
VALUES (1, 'AA')
, (2, 'AA')
, (3, 'AA')
, (4, 'AA')
, (5, 'AA')
, (6, 'AA')
CREATE TABLE #Prefix (Code VARCHAR(2), Prefix VARCHAR(3))
INSERT INTO #Prefix (Code, Prefix)
VALUES ('AA', 'ABC')
, ('AA', 'DEF')
, ('AA', 'GHI')
, ('AA', 'JKL')
我想将 #Data
中的 Prefix
值设置为来自 #Prefix
的随机值 Prefix
并匹配 Code
.
使用直线 inner join
只会导致使用一个值:
UPDATE D
SET Prefix = P.Prefix
FROM #Data AS D
INNER JOIN #Prefix AS P ON D.Code = P.Code
通过阅读此处的其他问题,建议使用 NEWID()
作为随机订购某物的一种方式。将 join
更改为:
SELECT TOP 1 subquery ordering by NEWID()
仍然只为每一行选择一个值(尽管每次都是随机的):
UPDATE D
SET Prefix = (SELECT TOP 1 P.Prefix FROM #Prefix AS P WHERE P.Code = D.Code ORDER BY NEWID())
FROM #Data AS D
因此,我不确定如何从单个更新语句中为每个数据条目获取随机前缀。我可能会在 #Data
table 中做一些循环,但我避免接触 SQL
中的循环,我确信那会很慢。这个的实际应用会在几万条记录上,几十个代码有几百个前缀。
这是怎么做的:
UPDATE d SET Prefix = ca.Prefix
FROM #Data d
CROSS APPLY(SELECT TOP 1 Prefix
FROM #Prefix p
WHERE d.DataID = d.DataID AND p.Code = d.Code ORDER BY NEWID()) ca
通知d.DataID = d.DataID
。这是为了强制 Sql Server
引擎重新评估 #Data
table.
中每一行的子查询
考虑这个数据:
CREATE TABLE #Data (DataID INT, Code VARCHAR(2), Prefix VARCHAR(3))
INSERT INTO #Data (DataID, Code)
VALUES (1, 'AA')
, (2, 'AA')
, (3, 'AA')
, (4, 'AA')
, (5, 'AA')
, (6, 'AA')
CREATE TABLE #Prefix (Code VARCHAR(2), Prefix VARCHAR(3))
INSERT INTO #Prefix (Code, Prefix)
VALUES ('AA', 'ABC')
, ('AA', 'DEF')
, ('AA', 'GHI')
, ('AA', 'JKL')
我想将 #Data
中的 Prefix
值设置为来自 #Prefix
的随机值 Prefix
并匹配 Code
.
使用直线 inner join
只会导致使用一个值:
UPDATE D
SET Prefix = P.Prefix
FROM #Data AS D
INNER JOIN #Prefix AS P ON D.Code = P.Code
通过阅读此处的其他问题,建议使用 NEWID()
作为随机订购某物的一种方式。将 join
更改为:
SELECT TOP 1 subquery ordering by NEWID()
仍然只为每一行选择一个值(尽管每次都是随机的):
UPDATE D
SET Prefix = (SELECT TOP 1 P.Prefix FROM #Prefix AS P WHERE P.Code = D.Code ORDER BY NEWID())
FROM #Data AS D
因此,我不确定如何从单个更新语句中为每个数据条目获取随机前缀。我可能会在 #Data
table 中做一些循环,但我避免接触 SQL
中的循环,我确信那会很慢。这个的实际应用会在几万条记录上,几十个代码有几百个前缀。
这是怎么做的:
UPDATE d SET Prefix = ca.Prefix
FROM #Data d
CROSS APPLY(SELECT TOP 1 Prefix
FROM #Prefix p
WHERE d.DataID = d.DataID AND p.Code = d.Code ORDER BY NEWID()) ca
通知d.DataID = d.DataID
。这是为了强制 Sql Server
引擎重新评估 #Data
table.