Сложная проблема MS Access с наибольшим количеством N на группу

StackOverflow https://stackoverflow.com/questions/1803396

Вопрос

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

  • 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 для этой проблемы с наибольшим количеством N на группу, выглядит следующим образом:

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', оно будет работать отлично (но мне нужно это ограничение).

Это было полезно?

Решение

Как насчет:

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

В противном случае вполне вероятно, что в тройку лидеров войдут некоторые

  where scouting.ownerGuild <> 'SWARM' 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top