从表 A 到表 B 传输随机列值
Posted
技术标签:
【中文标题】从表 A 到表 B 传输随机列值【英文标题】:From Table A to Table B transfer random column values 【发布时间】:2022-01-19 13:02:24 【问题描述】:我有两个表,我希望表 B 将随机表 A 值分配给特定列。
表 A:
SubscriptionID | Number | SubStart | SubEnd | MobPhoneID
1 321 2013-01 NULL NULL
2 123 2013-02 2014-02 NULL
3 321 2013-03 NULL NULL
4 444 2013-04 2013-04 NULL
5 555 2013-05 NULL NULL
表 B:
MobPhoneID | Manufacturer
1 Samsung
2 LG
3 Apple
4 Sony
我的目标是:
SubscriptionID | Number | SubStart | SubEnd | MobPhoneID
1 321 2013-01 NULL 3
2 123 2013-02 2014-02 NULL
3 321 2013-03 NULL 2
4 444 2013-04 2013-04 NULL
5 555 2013-05 NULL 4
我拥有的当前代码:
UPDATE TableA
SET MobPhoneID= t2.MobPhoneID
FROM TableA t1
CROSS APPLY (
SELECT TOP 1 MobPhoneID
FROM TableB
WHERE t1.SubEnd IS NULL
ORDER BY newid()
) t2
目标是将随机电话分配给订阅未结束的人。
上面的 SQL 查询产生以下输出:
SubscriptionID | Number | SubStart | SubEnd | MobPhoneID
1 321 2013-01 NULL 2
2 123 2013-02 2014-02 NULL
3 321 2013-03 NULL 2
4 444 2013-04 2013-04 NULL
5 555 2013-05 NULL 2
它不添加随机值,它只选择一个随机值并应用于所有。
我的愿望是每个人都能得到一部随机电话。
我希望我的问题有意义,我似乎无法弄清楚我做错了什么。
【问题讨论】:
【参考方案1】:如果一部手机只能分配一次? 然后通过随机的row_number分配就可以了。
;with A as ( select *, row_number() over (order by SubStart) rn from TableA where subend is null ) , B as ( select *, row_number() over (order by newid()) rn from TableB ) update A set MobPhoneID = B.MobPhoneID from B where B.rn = A.rn
订阅号 |号码 |子开始 |子端 |手机ID |制造商 -------------: | -----: | :------- | :-------- | ---------: | :----------- 1 | 321 | 2013-01 | 空 | 3 |苹果 2 | 123 | 2013-02 | 2014-02 | 空 | 空 3 | 321 | 2013-03 | 空 | 1 |三星 4 |第444章2013-04 | 2013-04 | 空 | 空 5 | 555 | 2013-05 | 空 | 2 | LGselect a.*, b.Manufacturer from TableA a left join TableB b on b.MobPhoneID = a.MobPhoneID order by SubscriptionID
dbfiddle here
上的演示【讨论】:
【参考方案2】:t1.SubEnd 为 Null 会导致它每次都选择相同的前 1 - 如果您将其设置为等于自身,则它会重新评估它。
UPDATE TableA
SET MobPhoneID= t2.MobPhoneID
FROM TableA t1
CROSS APPLY (
SELECT TOP 1 MobPhoneID
FROM TableB
WHERE t1.SubEnd = t1.SubEnd
ORDER BY newid()
) t2
我之前用过这个方法,得到了预期的结果。
【讨论】:
谢谢,这行得通,它将 MobilePhoneID 添加到 TableA 中的所有表中,我怎样才能做到这一点而不是随机应用到所有表,它们只适用于 IF SubEnd 为 Null?我的 WHERE t1.SubEnd IS NULL 的原因是我可以这样做。 尝试:WHERE t1.SubscriptionID = t1.SubscriptionID AND t1.SubEnd IS NULL - 如果可行,我会更新答案! 我试过了,影响0行。在这种情况下,它不起作用。 将 'subend is null 移到加入后 - 但保留订阅 = 订阅' ? 刚试了一下,同样的情况,0行受到影响。以上是关于从表 A 到表 B 传输随机列值的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 程序:从表 A 中读取,如果没有找到,则转到表 B