2011-01-14 2 views
0

Ich habe die folgende SQL-Anweisung - sie alle zipcodes zu finden versucht, die unsere Radwege, schneiden: -Wie kann ich eine TOP 1 und eine PARTITION BY in einer Sql UPDATE-Anweisung hinzufügen?

UPDATE a 
SET a.ZipCodeId = d.ZipCodeId 
FROM [dbo].[BikePaths] a 
    INNER JOIN [dbo].[BikePathBoundaries] b ON b.ZipCodeId = c.ZipCodeId 
    INNER JOIN [dbo].[ZipCodeBoundaries] c ON b.Boundary.STIntersects(c.Boundary) = 1 

was in Ordnung ist ... es sei denn, ein Radweg zwei oder mehr zipcodes schneidet (das ist ein geschieht Menge). Also, ich möchte sagen, Get the zipcode which this bikepath MOSTLY intersects (Ich habe eine andere Liste an anderer Stelle für alle bikpaths zu Postleitzahlen).

Wenn dies ist ein SELECT statemement, wäre es etwa so aussehen ...

SELECT a.BikePathId, a.BikePathName, c.ZipCodeId, d.ZipCode, 
    c.Boundary.STIntersection(d.Boundary).STArea() AS Area, 
    ROW_NUMBER() OVER (PARTITION BY a.BikePathId ORDER BY c.Boundary.STIntersection(d.Boundary).STArea() DESC) AS RowNumber 
FROM [dbo].[BikePaths] a 
    INNER JOIN [dbo].[BikePathBoundaries] b on a.BikePathId = b.BikePathId 
    INNER JOIN [dbo].[ZipCodeBoundaries] c on b.Boundary.STIntersects(c.Boundary) = 1 
    INNER JOIN [dbo].[ZipCodes] d on c.ZipCodeId = d.ZipCodeId 

und dann kann ich nur ein TOP 1 WHERE RowNumber = 1 hinzufügen, um sicherzustellen, ich eine Zeile pro Bikepath bekommen .. was wird die Postleitzahl haben, in der sich der Radweg meistens befindet/kreuzt.

Ich weiß, dass 2nd Sql-Anweisung haarig aussieht, mit dem Geo-Spatial Zeug hinzugefügt .. aber kann mir jemand helfen mit der Aufnahme dieser in eine UPDATE Aussage?

Antwort

3

Ich verwende keine Geo-Spatial-Abfragen, aber konnten Sie Ihre zweite Abfrage nicht in den allgemeinen Tabellenausdruck eingeben und in Ihrem Zeilennummerfeld = 1 einfügen?

;WITH CTE AS (
SELECT a.BikePathId, c.ZipCodeId, 
    Rnum =ROW_NUMBER() OVER (PARTITION BY a.BikePathId ORDER BY c.Boundary.STIntersection(d.Boundary)) 
FROM  [dbo].[BikePaths] a 
    INNER JOIN [dbo].[BikePathBoundaries] b on a.BikePathId = b.BikePathId 
    INNER JOIN [dbo].[ZipCodeBoundaries] c on b.Boundary.STIntersects(c.Boundary) = 1 
    INNER JOIN [dbo].[ZipCodes] d on c.ZipCodeId = d.ZipCodeId) 
UPDATE a 
SET a.ZipCodeId = cte.ZipCodeId 
FROM [dbo].[BikePaths] a 
    INNER JOIN cte on cte.bikepathid =a.bikepathid and cte.rnum=1; 
+0

CTE's? Wtf! Kenne diese nicht ... brb mit ein paar Antworten, nachdem ich dies hergegeben habe :) –

+1

+1 für gemeinsame Tabelle Ausdruck – VoodooChild

+0

Awesomesauce. Ich habe CTE total vergessen - ich vergesse immer, dass es sie gibt. Und willkommen in SA :) Habe ein paar Punkte :) (Oh, ich habe auch das Semikolon am Start bemerkt. Gut gemacht, dass das hinzugefügt wurde. Denn das hat mich schon ewig durcheinander gebracht: PI hat es auch am Ende des 'CTE' hinzugefügt Aussage ". –

Verwandte Themen