2016-12-08 6 views
0

У меня есть таблица с именем PostDkServicePoint, которая хранит кучу местоположений долготы/широты. Сегодня я называю это следующим образом - где он найдет 30 самых близких мест для заданных параметров lat/lng.Родительский ребенок присоединяется к sql-запросу, требуемому для SQL Server

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:

openingHoursId int 
servicePointId int 
day varchar 
from1 varchar 
to1 varchar 

Пример строк:

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 

Он содержит 24000 строк в total.I хотите объединить эти две таблицы так, что для каждого из 30 строк, возвращенные из вышеупомянутого SQL-запроса postdkservicepoint, также будут отображать все соответствующие дочерние строки в таблице 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, чтобы получить связанные строки.

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 Msg 102, Level 15, State 1, Line 16 Неверный синтаксис рядом с.. –

+0

Можете ли вы опубликовать некоторые данные из первого запроса? Просто создать тестовую среду. – McNets

+0

Хорошо, там было недостающее ',' Пожалуйста, проверьте его здесь, http://rextester.com/VQH68668 Я смоделировал с вершиной (10) – McNets

0

Если вы просто выполнение запроса вдоль линий:

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

где есть 5 строк в TableA и 5000 совпадающих строк на ID в TableB, то да, ваш выход будет иметь сопоставляя данные из обеих таблиц для каждой возвращаемой строки, в результате каждая строка TableA дублируется 5000 раз.

Это просто то, как работает SQL, и нет способа вернуть ваши данные в противном случае, если только вы не возвращаете несколько наборов данных и не присоединяете их вместе позднее в своем приложении. Как правило, доходы от передачи сети при этом значительно перевешиваются временем обработки, чтобы объединить данные вместе в вашем приложении, поскольку SQL невероятно эффективен при манипулировании данными.

Если ваш сетевой трафик превзойден, и вам абсолютно необходимо каждое значение строки - то есть: вы не агрегируете данные, возвращаемые - тогда вам может понадобиться изучить соединение в приложении, хотя обычно это не рекомендуется.

+0

@mcNets Итак, ваш вопрос здесь, будет ли «TOP 30» влиять только на первую таблицу или весь окончательный набор данных? – iamdave

+0

Я имел в виду, как это повлияет на производительность на весь окончательный набор данных, возвращенный - когда есть дубликаты .. –

+0

Да mcNets - это то, к чему я стремлюсь. –

Смежные вопросы