微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/mssql/77453.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐