Сложная проблема MS Access Greatest-N-Per-Group - PullRequest
0 голосов
/ 26 ноября 2009

Я хочу объединить следующие запросы в один, где

  • scouting.jumpGate является целым числом,
  • scouting.astroLoc - строка,
  • scouting.ownerguild - это строка, а
  • scouting.galaxy - это целое число

, который ссылается на другую таблицу (и это моя ГРУППА):

    Select TOP 3 
        scouting.jumpGate, 
        scouting.astroLoc, 
        scouting.ownerGuild, 
        scouting.Galaxy 
FROM    scouting 
WHERE   scouting.Galaxy = 1 
AND     scouting.ownerGuild = 'TEST' 
ORDER BY    scouting.jumpGate DESC, 
            scouting.astroloc DESC;

и

    SELECT TOP 3 
        scouting.jumpGate, 
        scouting.astroLoc, 
        scouting.ownerGuild, 
        scouting.Galaxy 
FROM    scouting 
WHERE   scouting.Galaxy = 2 
AND     scouting.ownerGuild = 'TEST' 
ORDER BY    scouting.jumpGate DESC, 
            scouting.astroloc DESC;

и

    SELECT TOP 3 
        scouting.jumpGate, 
        scouting.astroLoc, 
        scouting.ownerGuild, 
        scouting.Galaxy 
FROM    scouting 
WHERE   scouting.Galaxy = 3 
AND     scouting.ownerGuild = 'TEST' 
ORDER BY    scouting.jumpGate DESC, 
            scouting.astroloc DESC;

продолжалось до

    SELECT TOP 3 
        scouting.jumpGate, 
        scouting.astroLoc, 
        scouting.ownerGuild, 
        scouting.Galaxy 
FROM    scouting 
WHERE   scouting.Galaxy = 79 
AND     scouting.ownerGuild = 'TEST' 
ORDER BY    scouting.jumpGate DESC, 
            scouting.astroloc DESC;

Код, сгенерированный мною после прочтения на веб-сайте Microsoft этой проблемы Greatest N Per Group, выглядит следующим образом:

Select  scouting.astroLoc, 
        scouting.galaxy, 
        scouting.jumpGate, 
        scouting.ownerGuild 
From    galaxy Inner Join 
        scouting On galaxy.[galaxy_ID] = scouting.galaxy 
Where   scouting.ownerGuild = 'SWARM' 
AND     (scouting.jumpGate) In (Select Top 3 scouting.jumpGate From scouting Where scouting.galaxy = galaxy.[galaxy_ID] Order By scouting.jumpGate Desc) 
Order By    scouting.astroLoc Desc, 
            scouting.jumpGate Desc

По сути, это очень близко к тому, что я хотел бы. Кажется, все работает. Тем не менее, некоторые из ГРУПП не представлены в выходных данных, даже если посмотреть на данные, каждая группа имеет запись, которая удовлетворяет ограничениям запроса. Кстати, если я уберу ограничение scouting.ownerGuild = 'SWARM', оно будет отлично работать (но мне нужно это ограничение).

1 Ответ

0 голосов
/ 26 ноября 2009

Как насчет:

Select  scouting.astroLoc, 
        scouting.galaxy, 
        scouting.jumpGate, 
        scouting.ownerGuild 
From    galaxy Inner Join 
        scouting On galaxy.[galaxy_ID] = scouting.galaxy 
WHERE   (scouting.ID) In (
             Select Top 3 scouting.ID
             From scouting 
             Where scouting.galaxy = galaxy.[galaxy_ID] 
             And scouting.ownerGuild = 'SWARM' 
             Order By scouting.jumpGate Desc) 
Order By    scouting.astroLoc Desc, 
                scouting.jumpGate Desc

В противном случае представляется вероятным, что в топ-3 могут входить некоторые

  where scouting.ownerGuild <> 'SWARM' 
...