2016-07-21 17 views
3

Dies ist meine erste Zeit, um einen Stacküberlauf zu posten, und ich weiß, dass ähnliche Fragen schon einmal gestellt wurden, also entschuldige ich mich im Voraus. Allerdings kann ich das anscheinend nicht umgehen, ungeachtet der Lösungen, die in anderen Foren gegeben werden.Ersetzen von NAs in Spalte mit Werten aus einer anderen Tabelle SQL Server

Ich habe zwei Tabellen in SQL Server, einer enthält Storm Event-Informationen und der andere enthält County Info. Beide enthalten identische county_fips Nummern. Keine von diesen enthält Primär- oder Fremdschlüssel.

Ich muss die NAs von den storm event info mit den lat/lons aus der Komitats-Tabelle ersetzen. Ist dies ohne Fremd-/Primärschlüsselbeziehungen möglich?

Die StormEvent Tabelle sieht wie folgt aus:

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 

und so weiter ...

Die CountyTable sieht wie folgt aus (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 

Und so weiter.

Bisher habe ich den folgenden Code versucht, die Lat-Säule mit leichten Variationen anzupassen:

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

Die Abfrage ausgeführt wird, und ich habe gehört, dass x Höhe von Zeilen betroffen sind, aber wenn ich schreibe Eine SELECT-Anweisung zum Abrufen aller in den Lats enthaltenen NAs für die Tabelle StormEvent. Sie sind immer noch vorhanden.

Wenn mir jemand in die richtige Richtung zeigen kann, würde es sehr geschätzt werden! Nochmals, ich entschuldige mich, wenn ich in die falsche Richtung gehe, dies ist mein erster Beitrag und ich bin ein SQL-Novize.

+1

Ich denke, die 'Set' falsche Spalte-Namen hat. Sollte es 'n.LAT = sein. . .'? –

+0

Müssen Sie tatsächlich die Werte festlegen, oder müssen Sie nur Daten sehen, wenn Sie abfragen? – Mackers

+0

Ich muss die Werte setzen, muss schließlich diese Tabelle wieder nach R exportieren. – awal23

Antwort

1

Sie können nur müssen Sie Ihre JOIN aktualisieren. Ich habe einige Tabellenvariablen zum Testen erstellt.

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 

Sie Angenommen, wollen beide N/A Werte aktualisiert, fügen Sie einfach die Lon Spalte zu Ihrer UPDATE.

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

Ergebnisse:

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 
+0

Das war ein Tippfehler in der Frage, meine Schuld! Wie auch immer, ich habe Ihren Vorschlag einer vollen Outer Join verwendet und es hat funktioniert !! Ich überprüfe jetzt alles doppelt, aber es sieht soweit gut aus. – awal23

+0

Können Sie erklären, warum Sie denken, dass der FULL OUTER Beitritt notwendig ist? Ihr Code scheint ohne ihn identisch zu funktionieren. – beercohol

+0

@beercohol, das war genau das, was ich beim Testen der Abfrage verwendet habe und OP schien es zu mögen. Ich frage mich, ob es tatsächlich einen anderen Unterschied zwischen der ursprünglich eingegebenen und dieser Abfrage gab. – BJones

1

Angenommen, Sie nicht wirklich brauchen, um die Daten zu setzen, aber Sie wollen nur lat/lon Daten, um zu sehen, wenn Sie abfragen, sollten Sie in der Lage sein, so etwas zu tun:

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;