如何在SQL中将特定列从一个表复制到另一个表?

时间:2018-11-18 12:49:01

标签: sql sql-server

我是SQL Server和SQL语言的新手。我正在使用SQL Server Express。

我有两个表(Table_CoordinatesTable_Addresses)两个表都有40,000多个记录。

两个表列如下:

  • Table_CoordinatesPostcodeLatitudeLongitude
  • Table_AddressesBuilding_NumberPostcodeLatCoordLongCoord

LatCoord中的LongCoordTable_Addresses列为NULL

如屏幕截图所示,我要遍历Table_Coordinates中的每条记录,并复制第一条邮政编码(第一行)的LatitudeLongitude值,然后输入将LatCoord的{​​{1}}和LongCoord列中的值完全相同的Poscode,然后转到Table_Addresses中的第二条记录并对{{1}中的所有记录进行相同的操作}。

例如,如屏幕截图所示,将Table_Coordinates邮政编码坐标(53.340188,-2.838058)从Table_Coordinates复制到L24 2SA到其中邮政编码= Table_Coordinates

有人知道怎么做吗?

screen shot

4 个答案:

答案 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