【问题标题】:Replacing NAs in column with values from another table SQL Server用另一个表 SQL Server 中的值替换列中的 NA
【发布时间】:2016-11-25 11:06:52
【问题描述】:

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

我在 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 中包含的所有 NA 时,它们仍然存在。

如果有人能指出我正确的方向,将不胜感激!再次,如果我以错误的方式进行此操作,我深表歉意,这是我的第一篇文章,我是 SQL 新手。

【问题讨论】:

  • 我认为SET 的列名不正确。应该是n.LAT= . . .
  • 您真的需要设置这些值,还是只需要在查询时查看那里的数据?
  • 我确实需要设置值,最终必须将此表导出回 R。
  • set 的列名不正确,这是论坛中的一个错误...谢谢!我必须更新我的问题
  • 可以导出查询结果吗?

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


【解决方案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

【讨论】:

  • 那是问题的错字,我的错!但是,我使用了您关于完全外部连接的建议,它奏效了!!我现在正在仔细检查所有内容,但到目前为止看起来不错。
  • 您能解释一下为什么您认为 FULL OUTER 连接是必要的吗?没有它,您的代码似乎执行相同。
  • @beercohol,这正是我在测试查询时使用的,并且 OP 似乎喜欢它。我想知道最初输入的查询和这个查询之间是否真的有其他区别。
  • 所以,我错了。 NA 不再存在,因为它们被 NULLS 填充。我不确定为什么它不能从另一个表中获取值。
  • @bjones - 操作员错误。由于导入时出错,县表中也缺少我需要导入的值。对不起! (初学者)您的回答让我走上了正轨,谢谢!
【解决方案2】:

假设您实际上不需要设置数据,但您只想在查询时查看经纬度数据,您应该可以执行以下操作:

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;

【讨论】:

    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2016-01-09
    • 2019-08-23
    相关资源
    最近更新 更多