Сложная проблема MS Access с наибольшим количеством N на группу
-
05-07-2019 - |
Вопрос
Я хочу объединить следующие запросы в один, где
- 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'