【问题标题】:T-SQL - update all rows even if repeating dataT-SQL - 即使重复数据也更新所有行
【发布时间】:2017-02-24 22:31:27
【问题描述】:

我正在使用 T-SQL。我有两个表:全名表和 SSN 表。 SSN 表有 10000 多条记录,包括名字、姓氏和 ssn 列。 fullname 表有 100 条记录,包括名字和姓氏。

我想用全名中的名字和姓氏记录更新 SSN 表。在 100 条记录的末尾,我只想重复名称(从全名的第 1 行开始),直到它完成更新 SSN 表中的所有记录。我在下面尝试了这样的 MERGE,但收到了“MERGE 语句尝试多次更新或删除同一行”错误消息。在下面的代码中,我首先尝试更新 [last name] 列。你能帮忙吗?谢谢。

MERGE INTO [SSN]
   USING [fullname]
      ON 1=1
    WHEN MATCHED THEN
    UPDATE
        SET [last name] = [fullname].[last name];

【问题讨论】:

  • 所以要澄清一下:(1)您不关心将哪个名称分配给哪个 ssn,但是您想使用 100 个名称的轮换而不是仅使用一个名称,对吗? (2) 表是否有顺序 ID 列?
  • (1) 不,没关系。没有与 SSN 匹配的名称。这将是所有测试数据。 (2) 只有 SSN 确实有顺序 ID 列,但如果需要,我可以将顺序 ID 添加到全名表。
  • 请告诉我您没有以明文形式存储 SSN。我知道您正在生成测试数据,但 SSN 需要始终加密。
  • 你为什么在这里使用 MERGE 而不是更新?
  • @Sean,这些是测试 SSN,根本不是真正的 SSN。这是一个完全内部的测试数据库。我存储的信息无关紧要。我的总体目标是用名字姓氏更新所有 10000 多条记录。关于您的第二个问题,是的,我可以使用 UPDATE 但您能建议如何使用吗?我也尝试了 UPDATE,但它最多只能更新 100 条记录。

标签: sql sql-server


【解决方案1】:

更新 - 更正和解释

如果两个表都有连续的 id,那么您可以将 ON 子句更改为

ON [fullname].[ID] = [SSN].[ID] % 100

这个想法是,对于每个[SSN].[ID],您需要准确地选择一个[fullname].[ID],而%(整数除法余数或模)运算符为我们提供了一种方法,即选择每个[fullname] 记录大致相同的次数。

fullname 0 matches SSN 0, 100, 200, 300, ...
fullname 1 matches SSN 1, 101, 201, 301, ...

为了让它不留任何间隙地工作,你需要[fullname]记录每个[ID]的值从0到99。如果第一个[ID]是1,你可以调整这个说

ON [fullname].[ID] = ([SSN].[ID] % 100) + 1

假设您有一条 [fullname] 记录,其中 [ID] 为 100。如果您的 [fullname] 记录总数不同,您可以更改 % 后面的数字。

【讨论】:

  • 如果添加缺少的 ID 有问题,您可能可以使用row_number() over() 伪造它;但我持怀疑态度(现在还不能运行测试)
  • 谢谢,我会试试这个,但它会更新所有 10000+ 行吗?
  • 很高兴听到它成功了;抱歉,我没有回复您的第一个评论问题,我将在答案中添加一些说明,以解释为什么这应该有效
  • 校对它,顺便说一句,我很惊讶它的工作;原来我写错了……
【解决方案2】:

您可以按照这些思路使用更新语句来做到这一点。这假设 ssnTable.RowNumber (或任何您的实际名称)中没有间隙。如果您有差距,也可以在此处使用 RowNumber。

update s
set LastName = fn.FullName
from ssnTable s
join 
(
    select ROW_NUMBER() over(order by LastName) as RowNum
        , LastName
    from FullName
) fn on fn.RowNum = s.RowNumber % 100

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多