2011-01-14 2 views
0

나는 다음과 같은 SQL 문을 가지고 - 우리의 자전거 도로가 교차하는 모든 된 우편 번호를 찾을하려고 : -SQL UPDATE 문에 TOP 1과 PARTITION BY를 어떻게 추가 할 수 있습니까?

자전거 경로는을 발생하는 (두 개 이상의 된 우편 번호를 교차하지 않는 ... 괜찮
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 

제비). 그래서 저는 Get the zipcode which this bikepath MOSTLY intersects라고 말하고 싶습니다. (필자는 우편 번호에 대한 모든 bikpath를 다른 곳에서 가지고 있습니다). 이것은 SELECT statemement 이었다면

하는 TOP 1 WHERE RowNumber = 1하기 위해이 ...

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 

을 다음과 같이 보일 것입니다 그리고 난 그냥 추가 할 수 있습니다 내가 BikePath 당 하나의 행 ..를 얻을 수 있는지 확인하는 해당 자전거 경로가 대부분/내부에 포함 된 우편 번호를 갖습니다.

두 번째 SQL 문이 털이 많아서 Geo-Spatial 항목이 추가 된 것을 알고 있습니다. 그러나 누군가이를 UPDATE 문에 통합하는 데 도움이 될 수 있습니까?

답변

3

지리적 공간 쿼리를 사용하지 않지만 두 번째 쿼리를 공통 테이블 식에 입력하고 row_number 필드 = 1에 조인 할 수 없습니까?

;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! 모르겠다 ... 내가 전에 준 후 몇 가지 해답을 가진 브래지어 :) –

+1

+1 공통 테이블 식 – VoodooChild

+0

Awesomesauce. CTE에 대해 완전히 잊어 버렸습니다. 그리고 SA에 오신 것을 환영합니다 :) 몇 가지 점을 말하자면 :) (오, 나는 또한 세미콜론을 처음에 알아 챘습니다. 그게 .. 나이를 망쳐 놓은 원인이되었습니다. PI는 또한 CTE의 끝에 추가했습니다. 성명'. –

관련 문제