2017-05-11 4 views
0

Ich habe 2 Datensätze, Hydranten (3381 Datensätze) und Street Centerlines (6636 Datensätze). Ich möchte die Straße identifizieren, die jedem Hydranten-Datensatz am nächsten ist.Nächsten Nachbar in SQL Server berechnen

Nach einigen SQL Server-Ressourcen und Tutorials habe ich ein Skript zusammengestellt, aber es läuft seit über einer Stunde. Ich verstehe, dass der nächste Nachbar eine Weile braucht, um zu rennen, aber es scheint, als ob etwas in der Logik falsch wäre.

select 

h.OBJECTID, 
st.FULL_ST_NAME 

from WATER_HYDRANTS as h LEFT OUTER JOIN 
STREET_CENTERLINES as st 

on st.Shape.STDistance(h.SHAPE) is NOT NULL 
ORDER BY st.Shape.STDistance(h.SHAPE) ASC 

Der Grund, warum ich glaube, etwas in der Logik falsch ist, weil, wenn ich eine WHERE-Klausel hinzufügen, nur einen Datensatz mit einer ID zu wählen, die Abfrage eine Liste des gesamten Datensatz zurückgibt. In der ObjectID-Spalte ist es derselbe Wert (z. B. 13992) und in der FULL_ST_NAME-Spalte wird (ich nehme an) eine Liste von jeder Straße in Reihenfolge nach Nähe zu dem Feature angeordnet.

select  

h.OBJECTID, 
st.FULL_ST_NAME 

from WATER_HYDRANTS as h LEFT OUTER JOIN 
STREET_CENTERLINES as st 
on st.Shape.STDistance(h.SHAPE) is NOT NULL 

where h.OBJECTID = '13992' 

ORDER BY st.Shape.STDistance(h.SHAPE) ASC 

Idealerweise jeder Datensatz in der objectID Spalte eindeutig sein und die FULL_ST_NAME Spalte wird die Straße, die am nächsten zu jedem Hydranten ist.

Bitte lassen Sie mich wissen, wenn ich andere Informationen zur Verfügung stellen kann. Ich habe versucht, in meiner Erklärung gründlich zu sein, und habe einen Due-Diligence-Versuch unternommen, bevor ich zu SO kam.

Dank

+0

Was ist 'st.Shape.STDistance (h.SHAPE)'? Es sieht wie eine Tabellenspalte aus, aber dann wird ein Parameter an ihn übergeben, so dass er wie eine Funktion aussieht. Ist "st" auch der Name eines Schemas sowie der Alias ​​für die Tabelle oder so? In jedem Fall würden Sie erwarten, in diesem Fall ein vollständiges kartesisches Produkt zu erhalten, solange nichts null zurückgibt, da jede Zeile in beiden Tabellen Ihre Verknüpfungskriterien erfüllt. – mallan1121

+0

st.Shape.STDistance (h.SHAPE) ... st ist der Verweis auf den Street Centerline-Datensatz. h ist der Verweis auf den Hydrant-Datensatz. Also mein Verständnis ist die st.Shape ist die tatsächliche Geometrie der Straße Mittellinie, dann wird die Funktion STDistance auf der Geometrie des Hydranten berechnet. – csterling

Antwort

1

Statt LEFT OUTER JOIN StreetCenterLines Sie CROSS anwenden müssen. Die TOP 1 mit ORDER BY STDistance innerhalb des CROSS APPLY gibt Ihnen die nächstgelegene Straße für jeden Hydranten. (Ihre ursprüngliche Abfrage ergab ALLE Straßen für jeden Hydranten.)

Leichter zu zeigen als zu erklären; es ist so:

select 
h.OBJECTID, 
st2.FULL_ST_NAME 
from WATER_HYDRANTS as h 
CROSS APPLY (SELECT TOP 1 st.FULL_ST_NAME 
    FROM STREET_CENTERLINES as st 
    WHERE st.Shape.STDistance(h.SHAPE) IS NOT NULL 
    ORDER BY st.Shape.STDistance(h.SHAPE) ASC) as st2 

Es könnte lange dauern, obwohl laufen, da für jeden Hydrant es den Abstand zu jede Straße zu berechnen hat und dann den kürzesten zu finden.

+0

Danke für Ihre Hilfe. Wenn ich meinen Code so ändere, dass er zu Ihrem Vorschlag passt (den richtigen Dateinamen eingab), erhalte ich folgende Fehlermeldung: "Die Spalte" st "oder die benutzerdefinierte Funktion oder das Aggregat" st.Shape.STDistance "kann nicht gefunden werden mehrdeutig." Im Query Builder wird die folgende in rot- st2.FULL_ST_NAME, STREET_CENTERLINES unterstrichen, und beide Instanzen von st.Shape.STDistance (h.SHAPE) dem roten Unterstrich für st2.FULL_ST_NAME enthüllt „Ungültige Spaltenname Bewegen der Maus über ", über STREET_CENTERLINES zeigt" Die mehrteilige Kennung "street_centerlines) konnte nicht gebunden werden. – csterling

+0

Das Schweben über der roten Unterstreichung von st.Shape.STDistance zeigt an, dass "Spalte 'st' oder die benutzerdefinierte Funktion oder Aggregat 'st.Shape.STDistance' nicht gefunden werden kann, oder der Name ist mehrdeutig. – csterling

+1

Da ich Ihre nicht habe Datenbank Ich kann es nicht testen - Ich habe die Antwort bearbeitet - noch einmal versuchen. – Edward

Verwandte Themen