【问题标题】:Randomly select values fromone column and paste them in another table in sql从一列中随机选择值并将它们粘贴到sql中的另一个表中
【发布时间】:2021-02-02 12:28:39
【问题描述】:

我想从一个表(1000 行)中随机选择值并将它们放入另一个表(4000 行)。

第一个表是 Customer(1000 行),第二个表是 Customer_Account(4000 行)。他们都有一个列 Customer_ID 和 Account_ID。在 Customer_Account 表中,仅填充了 Customer_ID 列。 Customer_Account 表的 Account_ID 列我想用从客户的 Account_ID 列中随机选择的值填充。这意味着来自 Customer 表的相同值可能在 Customer_Account 表中出现多次。

此查询将第一个表中随机选择的单个值放入另外 4000 次:

set CustomerID = t2.CustomerID
from Customer_Account t1
cross apply (
    select top 10 CustomerID
    from Customer 
    where CustomerID=t1.CustomerId
    order by NewID()
) t2

关于如何解决这个问题的任何建议?

【问题讨论】:

    标签: sql select random


    【解决方案1】:

    您的问题有点难以理解。您说要分配帐户 ID,但代码分配了客户 ID。

    嗯,问题是子查询只被评估一次,所以你只能得到一组值。相反,随机枚举这两个表并使用算术来分配值:

    update ca
        set ca.account_id = c.account_id
        from (select ca.*, row_number() over (order by newid()) as seqnum
              from customer_account ca
             ) ca join
             (select c.*, row_number() over (order by newid()) as seqnum,
                     count(*) over () as cnt
              from customer c
             ) c
             on c.seqnum = (ca.seqnum % c.cnt) + 1
    

    【讨论】:

    • @Jason W 感谢您的回复!两个表 Customer 和 Customer_Account 都具有属性 CustomerId (和不同的行数)。建议的查询运行超过 2 小时,这是意料之中的吗?
    • @Roksana 。 . .对于您描述的数据量,这是没有意义的。等价的select 能玩多久(你可以做select * 然后from 子句)。
    • 也许你在另一个会话中有一个打开的事务阻塞了这个查询。戈登是对的,对于这一卷,它应该不会超过几秒钟。您可以运行“sp_who”并检查“blk”以查看是否发生任何阻塞。
    • @Jason W 是的!!!!你是对的,它成功了!!!非常感谢您的帮助
    【解决方案2】:

    你可以使用这样的东西。

    with c_cte(CustomerID) as (
        select top(1000) CustomerID
        from Customer
        order by newid())
    select c.CustomerID, t4.CustomerID
    from c_cte c
         cross apply (select top(4) CustomerID
                      from Customer
                      order by newid()) t4;
    

    要使用从 Customer 表中随机选择的 CustomerID 更新 Customer_Account 表中的现有行,您可以使用类似这样的方法

    update ca
      set AccountID=c_in.CustomerID
    from Customer_Account ca
         cross apply (select top(1) CustomerID
                      from Customer
                      order by newid()) c_in
    where ca.AccountID is null;
    

    【讨论】:

    • 我多次填充相同的数字...不是随机填充的 CustomerIds
    猜你喜欢
    • 2018-05-01
    • 2014-07-04
    • 2016-12-08
    • 2020-01-26
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2019-01-01
    相关资源
    最近更新 更多