0

我有 3 张桌子Campaign, Mall, MallCampaign(多对多),并且想订购一个或多个购物中心提供的最近的活动。

在第一个查询中;我有资格达到在不同商场提供的活动距离。但需要为所有广告系列执行此操作,而不仅仅是一个 (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
4

1 回答 1

0

这是做你想做的吗?它首先按广告系列 ID 排序,然后按距离排序:

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;

编辑:

你原来的问题没有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;
于 2013-07-27T12:22:38.097 回答