TSQL表间更新

时间:2009-09-10 00:49:57

标签: sql sql-server tsql

我有两个表,一个联系人表和一个地址表。 地址表包含联系人ID和4个地址行。 我希望使用地址表中的信息更新联系人表。 为简单起见,让表格如下:

地址(
。 contact int not null,
。 address1 varchar(32)not null,
。 address2 varchar(32)not null

触点(
。 id int主键,
。 addr1 varchar(32)not null,
。 addr2 varchar(32)not null

如何(int tsql)从地址表中更新联系人表? 感谢。

2 个答案:

答案 0 :(得分:5)

你没有。您的架构已损坏。您正在多个地方重复地址数据。

您的架构应该类似于

addresses(
. id int primary key,
. address1 varchar(32) not null,
. address2 varchar(32) not null
)

contacts(
.id int primary key
.addressId int foreign key (addresses.id)
}

因此,要获取联系人的地址,您可以执行以下连接:

select 
    c.id contactId,
    a.address1,
    a.address2 
from 
    contacts c 
    join addresses a on 
        c.addressId=a.id 
where 
    c.id=@someContactId

要更新,您将执行以下操作:

update a
   set a.address1='27 Foo Street'
from
   addresses as a
   join contacts as c
       on a.id=c.addressId
where c.id=@someContactId    

在数据库中复制数据并不是一个好主意。搜索术语数据库规范化以获取有关此主题的更多信息。

答案 1 :(得分:0)

我同意'花钱' - 你不应该复制这些数据。

但是,如果必须进行批量更新,则这是您使用的T-SQL语句:

UPDATE dbo.Contacts
SET addr1 = address1,
    addr2 = address2
FROM dbo.Addresses
WHERE id = contact

您只需通过定义WHERE id = contact子句将Contacts表连接到Addresses表,然后将Contacts表上的addr1 / addr2字段设置为Addresses表中address1 / address2的相应值 - 非常简单,嗯?

马克