使用另一个表SQL Server中的值替换列中的NAs

时间:2016-07-21 18:00:59

标签: sql sql-server join sql-update inner-join

这是我第一次发帖到堆栈溢出,我知道之前已经问过类似的问题,所以我提前道歉。但是,无论其他论坛中提供的解决方案如何,我似乎都无法解决这个问题。

我在SQL Server中有两个表,一个包含风暴事件信息,另一个包含县信息。它们都包含相同的county_fips个数字。这些都不包含主键或外键。

我需要用来自县表的纬度/经度来替换风暴事件信息中的NA。如果没有外国/主要关键关系,这可能吗?

StormEvent表如下所示:

ID | Lat | Lon | State_FIPS | County_FIPS 
------------------------------------------
1  |  33 | -88 |    028     |    087
2  |  31 | -98 |    048     |    225
3  |  NA |  NA |    017     |    034
4  | 39  | -100|    020     |    063

依旧......

CountyTable看起来像这样(statefp10,countyfp10 = FIPS; intptlat10,intptlon10 = lat / lon):

  StateFP10 | County_FP10   | State_FP10| intptlat10 | intptlon10
   --------------------------------------------------------------
    1       |  087          | 028       |    33      |  -88
    2       |  225          | 048       |    31      |  -98     
    3       |  034          | 017       |    45      |  -102

等等。

到目前为止,我已尝试使用以下代码调整Lat列,但略有不同:

UPDATE n 
SET n.lat= c.intptlat10
FROM StormEvent n 
INNER JOIN CountyTable c ON n.County_FIPS= c.CountyFP10
WHERE n.LAT = 'NA' 

查询已执行,我告诉x行数受影响,但当我编写一个select语句来检索StormEvent表的Lats中包含的所有NAs时,它们是还在那儿。

如果有人能指出我正确的方向,我将不胜感激!我再次道歉,如果我以错误的方式解决这个问题,这是我的第一篇文章,我是一名SQL新手。

2 个答案:

答案 0 :(得分:2)

假设您实际上并不需要设置数据,但您只想在查询时查看lat / lon数据,那么您应该可以执行以下操作:

select 
a.ID, 
case a.Lat when 'NA' then b.intptlat10 else a.Lat end as Lat, 
case a.Lon when 'NA' then b.intptlon10 else a.Lon end as Lon, 
a.State_FIPS, 
a.County_FIPS 
from StormEvent a
left join CountyTable b
on a.State_FIPS = b.StateFIPS;

答案 1 :(得分:1)

您可能只需要更新JOIN。我已经创建了一些表变量来测试。

DECLARE @StormEvent TABLE (ID INT, Lat VARCHAR(10), Lon VARCHAR(10), 
                            State_FIPS INT, County_FIPS INT)
INSERT @StormEvent (ID , Lat, Lon, State_FIPS, County_FIPS)
VALUES  (1,'33','-88',028,087),
        (2,'31','-98',048,225),
        (3,'NA','NA',017,034),
        (4,'39','-100',020,063)


DECLARE @CountyTable TABLE (StateFP10 INT, County_FP10   INT, State_FP10 INT, 
                            intptlat10 VARCHAR(10), intptlon10 VARCHAR(10))
INSERT @CountyTable
VALUES  (1,087,028,'33','-88'),
        (2,225,048,'31','-98'),
        (3,034,017,'45','-102')

UPDATE n 
SET n.lat= c.intptlat10, n.Lon = c.intptlon10
FROM @StormEvent n 
INNER JOIN @CountyTable c ON n.State_FIPS= c.State_FP10
WHERE n.LAT = 'NA'

SELECT *
FROM @StormEvent

假设您希望更新两个N/A值,只需将Lon列添加到UPDATE

SET n.Lat = c.intptlat10, n.Lon = c.intptlon10

结果:

ID  Lat Lon     State_FIPS   County_FIPS
1   33  -88     28           87
2   31  -98     48           225
3   45  -102    17           34
4   39  -100    20           63