从表 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
select a.*, b.Manufacturer
from TableA a
left join TableB b on b.MobPhoneID = a.MobPhoneID
order by SubscriptionID
订阅号 |号码 |子开始 |子端 |手机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 | LG

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 传输随机列值的主要内容,如果未能解决你的问题,请参考以下文章

从表A中选择部分字段插入到表B

我有两个表我想从表 A 更新到表 B 。根据条件ID填空

Oracle 程序:从表 A 中读取,如果没有找到,则转到表 B

从表 1 中选择某列并使用 Where 子句条件插入到表 2 中的某列

将数据从一列传输到不同表中的不同列

将数据从表传输到 XML 对象表