【问题标题】:From Table A to Table B transfer random column values从表 A 到表 B 传输随机列值
【发布时间】: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

它不添加随机值,它只选择一个随机值并应用于所有。

我的愿望是每个人都能得到一部随机电话。

我希望我的问题有意义,我似乎无法弄清楚我做错了什么。

【问题讨论】:

    标签: sql database tsql


    【解决方案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行受到影响。
      猜你喜欢
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2017-05-13
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多