【问题标题】:How do I generate a crosswalk ID between two SQL tables如何在两个 SQL 表之间生成人行横道 ID
【发布时间】:2015-07-21 00:15:28
【问题描述】:

我有一个 SQL 表,其中包含姓名、地址和一些与代码配对的相关数字数据。该表的结构使得每个数字代码对都有自己的行,其中包含冗余地址信息。下面的简写,我们就叫它tblPeopleData

Name            Address                       ArbitraryCode    ArbitraryData
----------------------------------------------------------------------------
John Adams      45 Main St, Rochester NY            a                111
John Adams      45 Main St, Rochester NY            a                231
John Adams      45 Main St, Rochester NY            a                123
John Adams      45 Main St, Rochester NY            b                111
John Adams      45 Main St, Rochester NY            c                111
John Adams      45 Main St, Rochester NY            d                123
John Adams      45 Main St, Rochester NY            d                124
Jane McArthur   12 1st Ave, Chicago IL              a                111
Jane McArthur   12 1st Ave, Chicago IL              a                231
Jane McArthur   12 1st Ave, Chicago IL              a                123
Jane McArthur   12 1st Ave, Chicago IL              b                111
Jane McArthur   12 1st Ave, Chicago IL              c                111
Jane McArthur   12 1st Ave, Chicago IL              e                123
Jane McArthur   12 1st Ave, Chicago IL              e                124

我的问题是该表绝对庞大(约 1000 万行),我正在尝试将其拆分以使遍历变得不那么缓慢。

到目前为止,我所做的是制作一个仅包含地址的表格,使用类似:

SELECT DISTINCT Address FROM tblPeopleData (etc.)

留给我:

Name            Address                       
------------------------------------------
John Adams      45 Main St, Rochester NY      
Jane McArthur   12 1st Ave, Chicago IL           

...只是地址列表。我希望能够查找每个地址并查看该地址中存在哪些名称,因此我为每个地址分配了一个 UniqueID,这样现在我就有了(该表在我的数据集中大约有 500,000 行):

Name            Address                       AddressID
--------------------------------------------------------
John Adams      45 Main St, Rochester NY      000001
Jane McArthur   12 1st Ave, Chicago IL        000002

为了能够按地址查找人员,我需要将此 AddressID 字段添加到 tblPeopleData,以便 tblPeopleData 中的每个地址都与其 AddressID 相关联,并将其添加到每一行,这样我就可以:

Name            Address                       ArbitraryCode    ArbitraryData    AddressID
----------------------------------------------------------------------------------------
John Adams      45 Main St, Rochester NY            a                111          00001
John Adams      45 Main St, Rochester NY            a                231          00001
John Adams      45 Main St, Rochester NY            a                123          00001
John Adams      45 Main St, Rochester NY            b                111          00001
John Adams      45 Main St, Rochester NY            c                111          00001
John Adams      45 Main St, Rochester NY            d                123          00001
John Adams      45 Main St, Rochester NY            d                124          00001
Jane McArthur   12 1st Ave, Chicago IL              a                111          00002
Jane McArthur   12 1st Ave, Chicago IL              a                231          00002
Jane McArthur   12 1st Ave, Chicago IL              a                123          00002
Jane McArthur   12 1st Ave, Chicago IL              b                111          00002
Jane McArthur   12 1st Ave, Chicago IL              c                111          00002
Jane McArthur   12 1st Ave, Chicago IL              e                123          00002
Jane McArthur   12 1st Ave, Chicago IL              e                124          00002

如何从我的唯一地址表中的 AddressID 的 UniqueID 跳转到将这些全部添加到我的tbPeopleData 中对应地址的每一行?

【问题讨论】:

  • 这里需要三个表。一个用于名称,另一个用于地址,第三个用于任意数据。名称表将具有地址表的外键,而任意数据表将具有名称/人员表的外键。
  • 我可以试试这个。实际上已经有一个预先存在的唯一 ID 绑定了 ArbitraryData 和 Person,所以我可以毫不费力地拆分它。

标签: sql sql-server tsql


【解决方案1】:

只需将计算出的 AddressID 回填到 tblPeopleData - 您可以将 UPDATEFROM 组合起来(就像您在选择中所做的那样)

UPDATE tblPeopleData 
SET AddressID = a.AddressID
FROM tblPeopleData pd
INNER JOIN tblAddressData a
 ON pd.Address = a.Address

【讨论】:

  • 谢谢,这对我很有效。此外,由于我要处理大约 1000 万行并且查询需要很长时间,this answer 对跟踪进度非常有帮助。
【解决方案2】:

您将更改表以具有地址 id:

alter table tblPeopleData add AddressId int references Address(AddressId);

然后您可以使用JOIN 更新值:

update tblPeopleData pd JOIN
       Address a
       ON pd.Address = a.Address
    pd.AddressId = a.AddressId;

为此,您肯定需要在Address(Address) 上建立索引。

然后,您可以删除旧列:

alter table drop column Address;

注意:

将结果保存在临时表中可能会更快,因为更新会生成大量的日志记录。为此,截断原始表,然后重新加载数据:

SELECT . . . , a.AddressId
INTO tmp_tblPeopleData
FROM tblPeopleData pd JOIN
     Address a
     ON pd.Address = a.Address;

TRUNCATE TABLE tblPeopleData;

INSERT INTO tblPeopleData( . . .)
    SELECT . . .
    FROM tmp_tblPeopleData;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 2017-03-17
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多