sql – 使用其他表中多个值的随机更新表

前端之家收集整理的这篇文章主要介绍了sql – 使用其他表中多个值的随机更新表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑这些数据:
CREATE TABLE #Data (DataID INT,Code VARCHAR(2),Prefix VARCHAR(3))

INSERT INTO #Data (DataID,Code)
VALUES (1,'AA'),(2,(3,(4,(5,(6,'AA')

CREATE TABLE #Prefix (Code VARCHAR(2),Prefix VARCHAR(3))

INSERT INTO #Prefix (Code,Prefix)
VALUES ('AA','ABC'),('AA','DEF'),'GHI'),'JKL')

我想将#Data中的前缀值设置为#Prefix中的随机前缀,并带有匹配的代码.

使用直接内连接只会导致使用一个值:

UPDATE D
SET Prefix = P.Prefix
FROM #Data AS D
INNER JOIN #Prefix AS P ON D.Code = P.Code

从这里阅读其他问题,建议将NEWID()作为随机排序的方式.将联接更改为:

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表进行某种循环,但我避免在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表中的每一行重新评估子查询.

原文链接:https://www.f2er.com/mssql/77453.html

猜你在找的MsSQL相关文章