【发布时间】:2013-01-21 10:21:58
【问题描述】:
我正在编写一个脚本来匿名化包含患者数据的表格。 我生成了一个包含 50,000 行匿名数据的表。
我需要的是用生成表中的数据更新患者表中的一些列。
当然,我已经阅读了有关更新表格以及如何从另一个表格中选择随机行的信息。我不知道如何在一个查询中组合它。
我已将 CTE 视为一种可能的解决方案,但我不明白它是如何工作的。我遇到的主要问题之一是生成的表中没有任何键,即使它有它也不应该是相关的,因为我只想迭代患者表的所有行,用随机行更新其值从生成的表中。
我有以下内容:
Update Patients
Set Patients.pat_FirstName = fn.GivenName,
pat_LastName = fn.SurName,
pat_StreetName = fn.StreetAddress,
pat_PostalCode = fn.ZipCode,
pat_City = fn.City,
pat_DateOfBirth = fn.BirthDay,
from
( Select Top 1,
GivenName,
SurName,
StreetAddress,
ZipCode,
City,
Birthday
from FakeNameGenerator tablesample(1000 rows)) as fn
但这只会执行一次“随机”,用相同的值填充患者表中的每一行。就像我之前说的,它可以(应该??)用 CTE(理货?)表解决,但是如何解决呢?
我已经接近掌握 C# 并且只是编写该死的东西......
【问题讨论】:
-
@MahmoudGamal - 没有。应该是随机的。 @弗兰克你需要确保子查询是相关的例子这里stackoverflow.com/a/12922951/73226虽然只更新一列。如果您为所涉及的两个表都提供了
CREATE TABLE,我可能会考虑修改它。 -
@MartinSmith - 非常酷。它确实只更新了一列。我的兴趣被激发了,虽然我很高兴为每一列调用这个 SQL(毕竟它是随机数据),但我很好奇如何在每个查询的一行中处理它。为什么需要我的 create 语句?我不需要更改数据库。我会吗?
-
您使用的是什么 DBMS?如果您可以使用
CROSS APPLY,您可以在链接中使用@MartinSmith 的回答相同的原则,使用UPDATE Patients SET Patients.pat_FirstName = fn.GivenName,.... FROM Patients CROSS APPLY (SELECT TOP 1 .... ORDER BY NEWID(), Patients.PatientID) fn -
@GarethD - 来自
tablesample和TOP很可能是SQL Server,所以你的评论应该是一个答案。 -
好吧,19 行并没有什么特别之处。这种行为是否始终可重复并出现在整个表格中?如果您发布实际执行计划的 XML,我可以看一下。
标签: sql random common-table-expression