2013-07-27 5 views
0

У меня есть 3 таблицы Campaign, Mall, MallCampaign (многие-ко-многим) и вы хотите заказать ближайшие кампании, которые доступны в одном или нескольких торговых центрах.SQL Server: хранимая процедура многозначный запрос таблицы

В первом запросе; Я имею право на доступ к дистанции кампаний, которые доступны в разных торговых центрах. Но нужно делать это для всех кампаний не только (Id = 79). Мне не удалось это сделать с помощью JOIN.

SELECT 
    m.MallId, 
    ROUND(@geo1.STDistance(geography::Point(m.MallLatitude, m.MallLongitude, 4326))/1000,1) AS Distance 
FROM 
    MallCampaign mc 
INNER JOIN 
    Mall m ON m.MallId = mc.MallId 
WHERE 
    m.IsActive != 0 AND mc.CampaignId = 79 
ORDER BY 
    Distance 

SELECT 
    ca.CampaignId, ca.CampaignTitle 
FROM 
    Campaign ca 

ответ

0

Это делает то, что вы хотите? Это сортирует идентификатор кампании первым, а затем расстояние:

SELECT mc.CampaignId, m.MallId, 
     ROUND(@geo1.STDistance(geography::Point(m.MallLatitude, m.MallLongitude, 4326))/1000,1) AS Distance 
FROM MallCampaign mc join 
    Mall m 
    ON m.MallId = mc.MallId 
WHERE m.IsActive <> 0 
ORDER BY mc.CampaignId, Distance; 

EDIT:

Ваш первоначальный вопрос не было в нем top, что я вроде как ожидается. Чтобы справиться с этим, вы хотите использовать row_number(). В этом случае проще всего выполнить два подзапроса (или CTE):

select CampaignId, MallId, Distance 
from (select mc.*, 
      row_number() over (partition by CampaignId order by distance) as seqnum 
     from (SELECT mc.CampaignId, m.MallId, 
        ROUND(@geo1.STDistance(geography::Point(m.MallLatitude, m.MallLongitude, 4326))/1000,1) AS Distance 
      FROM MallCampaign mc join 
       Mall m 
       ON m.MallId = mc.MallId 
      WHERE m.IsActive <> 0 
      ) mc 
    ) mc 
where seqnum = 1; 
+0

Что делать, если я хочу показать только одну строку (минимальную дистанцию) одной кампании? Я попробовал MIN (Расстояние), но он дает ошибку для раздела GROUP BY для других выбранных элементов. –

+0

Да, я пропустил это извините. Также добавлены сведения о кампании и упорядочены по расстоянию. Прекрасно работает :) Большое спасибо! –

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