gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:58:50 24 4
gpt4 key购买 nike

考虑这个数据:

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')

我想设置 Prefix值在 #Data成为一个随机 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 做某种循环表,但我避免接触 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 。

关于sql - 使用其他表中的多个值的随机更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30532251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com