通过基于表行选择一个值来更新另一个表的SQL更新字段

时间:2020-01-06 09:14:47

标签: sql sql-server tsql

我有一个db表,其中包含由数据创建工具创建的随机个人详细信息。

我要使用此表中的值更新另一个表中的字段,以便在我们对另一台服务器上的问题进行故障排除时掩盖实时个人详细信息。

表如下:


表1:tblRandom_Data

字段:名字|姓


表2:tblCustomers

字段:CustomerID [GUID] |名|姓| Address_Line1 ..........


我想通过从tblRandom_Data中选择一个随机的First_Name值来更新tblCustomers中所有行的First_Name字段。

我尝试了以下操作,但这会更新所有具有选定随机名的行。所有值不必都是唯一的,但是需要有所不同。

Update tblCustomers 
        SET First_Name = (SELECT TOP 1 First_Name 
                          FROM tblRandom_Data
                          ORDER BY NEWID()
                         )

2 个答案:

答案 0 :(得分:1)

您可以使用apply

select c.*, rd.first_name
from tblCustomers c cross apply
     ( select top (1) rd.first_name
       from tblRandom_Data rd
       where rd.address_line1 <> c.first_name -- you can use any column combination that would always be not matched with each other
       order by newid()
     ) rd;

答案 1 :(得分:0)

这是使用row_number()和可更新的CTE的一种方法:

with cte as (
    select 
        c.first_name, 
        c.surname, 
        r.first_name r_first_name, 
        r.surname r_surname,
        row_number() over(partition by c.customer_id order by newid()) rn
    from tblCustomers c
    cross join tblRandom_Data r 
)
update cte 
set first_name = r_first_name, surname = r_surname
where rn = 1

cte生成两个表的笛卡尔积,并对具有相同customer_id的组中的每个记录影响一个随机数。外部查询执行实际的更新。

Demo on DB Fiddlde

样本数据:

select * from tblCustomers;
customer_id | first_name | surname
----------: | :--------- | :------
          1 | null       | null   
          2 | null       | null   
          3 | null       | null   
          4 | null       | null   
select * from tblRandom_Data;
first_name | surname
:--------- | :------
foo        | bar    
baz        | zoo    

运行更新后:

select * from tblCustomers;
customer_id | first_name | surname
----------: | :--------- | :------
          1 | baz        | zoo    
          2 | foo        | bar    
          3 | baz        | zoo    
          4 | foo        | bar