我是SQL Server和SQL语言的新手。我正在使用SQL Server Express。
我有两个表(Table_Coordinates
和Table_Addresses
)两个表都有40,000多个记录。
两个表列如下:
Table_Coordinates
:Postcode
,Latitude
和Longitude
。Table_Addresses
:Building_Number
,Postcode
,LatCoord
和LongCoord
LatCoord
中的LongCoord
和Table_Addresses
列为NULL
。
如屏幕截图所示,我要遍历Table_Coordinates
中的每条记录,并复制第一条邮政编码(第一行)的Latitude
和Longitude
值,然后输入将LatCoord
的{{1}}和LongCoord
列中的值完全相同的Poscode,然后转到Table_Addresses
中的第二条记录并对{{1}中的所有记录进行相同的操作}。
例如,如屏幕截图所示,将Table_Coordinates
邮政编码坐标(53.340188,-2.838058)从Table_Coordinates
复制到L24 2SA
到其中邮政编码= Table_Coordinates
有人知道怎么做吗?
答案 0 :(得分:2)
如果要显示,可以使用联接,但是如果通常要更新记录,则在这种情况下,首选游标。您可以通过以下方式进行操作。
Declare @LatCoord nvarchar
Declare @LongCoord nvarchar
DECLARE [YourCursorName] CURSOR FAST_FORWARD
FOR
SELECT LatCoord, LongCoord FROM Table_Coordinates where postcode = @Postcode
OPEN [YourCursor] FETCH NEXT FROM [YourCursor] INTO @LatCoord, @LongCoord
WHILE @@FETCH_STATUS = 0
BEGIN
Update [Table_Addresses]
SET LatCoord = @LatCoord, LongCoord = @LongCoord where postcode = @Postcode
FETCH NEXT FROM [YourCursor] INTO @LatCoord, @LongCoord
END
CLOSE [YourCursor]
DEALLOCATE [YourCursor]
答案 1 :(得分:1)
带有WHERE子句的简单JOIN即可完成工作
UPDATE T1
SET T1.LatCoord = T2.Latitude,
T1.LongCoord = T2.Longitude
FROM Table1 T1 INNER JOIN Table2 T2
ON T1.PostCode = T2.PostCode
WHERE T1.PostCode = 'L24 2SA'
答案 2 :(得分:1)
我认为您不应该这样做。从地址表中删除坐标。当您需要访问它们时,只需使用join
:
select a.*, c.atitude, c.longitude
from table_addresses a left join
table_coordinates c
on a.postcode = c.postcode;
如果您不想显式运行代码,则可以将其隐藏在视图中:
create view v_addresses as
select a.*, c.atitude, c.longitude
from table_addresses a left join
table_coordinates c
on a.postcode = c.postcode;
为什么我推荐这种方法?跨表复制数据是一个错误的设计决策。如果您不熟悉SQL,则尤其如此。您需要学习如何处理多个表中的数据。
想一想如果tbl_coordinates
中的数据发生变化会怎样?然后,您必须重复更新-如果您记得这样做的话。否则,数据将不同步。
性能如何?如果在table_coordinates(postcode)
上有索引,您甚至都不会注意到差异。
答案 3 :(得分:1)
使用JOIN更新
UPDATE Table_Addresses
SET Table_Addresses.LatCoord = Table_Coordinates.Latitude, Table_Addresses.LongCoord = Table_Coordinates.Longitude
FROM Table_Addresses JOIN Table_Coordinates
ON Table_Addresses.Postcode = Table_Coordinates.Postcode