加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 06:54:39 所属栏目:MsSql教程 来源:网络整理
导读:考虑这些数据: 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)VALU
考虑这些数据:
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表中的每一行重新评估子查询.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读