2016-12-08 4 views
0

위도/경도 위치를 저장하는 PostDkServicePoint이라는 테이블이 있습니다. 나는 오늘 이것을 이렇게 부르고 있는데 - 여기서 지정된 lat/lng 매개 변수에 가장 가까운 30 개의 가장 가까운 위치를 찾는다.SQL Server에 대한 부모 자식 조인 SQL 쿼리

openingHoursId int 
servicePointId int 
day varchar 
from1 varchar 
to1 varchar 

예 행 :

SELECT TOP (30) 
    PostDkServicePoint.location.Lat AS latitude,  
    PostDkServicePoint.location.Long AS longitude, 
    PostDkServicePoint.servicePointId 
FROM   
    PostDkServicePoint 
WHERE  
    (PostDkServicePoint.location.STDistance('POINT(40.587990 -73.662457)') IS NOT NULL) 
ORDER BY 
    PostDkServicePoint.location.STDistance('POINT(40.587990 -73.662457)') 

는 지금은 다른 테이블은 PostDkOpeningHour를 불렀다

그것은 total.I에서 24000 행이 포함
1233 5725 MONDAY  07:00 19:00 
1234 5725 TUESDAY  07:00 19:00 
1235 5725 WEDNESDAY 07:00 19:00 
1236 5725 THURSDAY 07:00 19:00 

두 테이블을 조인 할 있도록 각 위의 postdkservicepoint SQL 쿼리에서 반환 된 30 개의 행은 PostDkOpeningHour 테이블에있는 모든 일치하는 하위 행을 표시합니다 (여기서 servicepointid는 두 개의 테이블).

5725 40.587990 -73.662457 MONDAY 07:00 19:00 
5725 40.587121 -73.662412 TUESDAY 07:00 19:00 

나보다 그것을 반환 할 수있는 방법이있다 : - 예 : "가입"쿼리와

는 위도/경도 데이터는 바로이 같은 시간에 데이터를 열고 각 행에 대해 중복됩니다 부모 자녀 관계 스타일?

답변

0

저의 겸허 한 의견으로는 먼저 30 개의 레코드를 가져와 PostDkServicePoint으로 JOIN하여 관련 행을 가져와야합니다.

WITH CTE (latitude, longitude, servicePointId) AS 
(
SELECT TOP (30) 
    PostDkServicePoint.location.Lat AS latitude,  
    PostDkServicePoint.location.Long AS longitude, 
    PostDkServicePoint.servicePointId 
FROM   
    PostDkServicePoint 
WHERE  
    (PostDkServicePoint.location.STDistance('POINT(40.587990 -73.662457)') IS NOT NULL) 
ORDER BY 
    PostDkServicePoint.location.STDistance('POINT(40.587990 -73.662457)') 
) 
SELECT 
    cte.servicePointId, 
    cte.latitude, 
    cte.longitude, 
    PostDkOpeningHour.day, 
    PostDkOpeningHour.from1, 
    PostDkOpeningHour.to1 
FROM 
    cte 
    INNER JOIN PostDkOpeningHour 
     ON cte.servicePointId = PostDkOpeningHour.servicePointId; 
+0

감사합니다. 코드를 실행할 때이 줄에 오류가 발생합니다. cte.servicePointId 메시지 102, 수준 15, 상태 1, 줄 16 '.'근처의 구문이 잘못되었습니다. –

+0

첫 번째 쿼리에서 일부 데이터 결과를 게시 할 수 있습니까? 테스트 환경을 구축하기 만하면됩니다. – McNets

+0

좋아, 누락 된 ','여기를 확인하십시오. http://rextester.com/VQH68668 위로 가기 (10) – McNets

0

당신은 단순히의 라인을 따라 쿼리를 실행하는 경우 : TableA의 5 행과 TableB의에서 ID 당 5000 개 일치하는 행이

select a.Col1 
     ,a.Col2 
     ,b.Col1 
     ,b.Col2 
from TableA a 
    inner join TableB b 
     on(a.ID = b.FKID) 

는 다음 네, 출력이있을 것이다 각 행에 대해 두 테이블의 일치하는 데이터가 반환되므로 각 TableA 행이 5000 번 복제됩니다.

이것은 단순히 SQL이 작동하는 방식이며, 여러 데이터 집합을 반환하고 나중에 응용 프로그램에서 함께 사용하지 않는 한 데이터를 반환 할 방법이 없습니다. 일반적으로 데이터를 처리 할 때 SQL이 매우 효율적이기 때문에이 작업에서 네트워크 전송 이득은 응용 프로그램에서 데이터를 다시 결합하는 처리 시간보다 훨씬 중요합니다.

네트워크 트래픽이 매우 높고 모든 행 값을 절대적으로 필요로하는 경우 (즉, 반환 된 데이터를 집계하지 않는 경우) 일반적으로 권장되지는 않지만 신청서에 참여할 수 있습니다.

+0

@mcNets 'TOP 30'이 첫 번째 테이블 또는 전체 최종 데이터 세트에만 영향을 미치는지 여부에 대한 질문은 여기에 있습니까? – iamdave

+0

나는 그것이 반환 된 전체 최종 데이터 세트의 성능에 어떻게 영향을 미치는지를 의미했습니다. 중복이있을 때 ... –

+0

예 mcNets - 그게 내가 원하는 것입니다. –