我有一个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()
)
答案 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
的组中的每个记录影响一个随机数。外部查询执行实际的更新。
样本数据:
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