Как получить запись основной таблицы по количеству записей таблицы подробностей без top (1) - PullRequest
0 голосов
/ 16 сентября 2011

У меня есть основная таблица (Team) и таблица сведений (TeamMember). TeamMember имеет FK для команды. Мне нужно получить командную запись для команды, в которой больше всего членов команды. У меня сначала было

SELECT team.name
FROM   team
       INNER JOIN (SELECT TOP 1 COUNT(*) AS membercount,
                          teamID
                   FROM   teammember
                   GROUP BY teamID
                   ORDER BY Count(*) DESC) AS team_with_most_members
         ON team.id = team_with_most_members.teamID

Мне сообщили, что я не могу использовать TOP (1) в своих запросах. У кого-нибудь есть идеи, как я могу это сделать без?

Спасибо!

Team
ID, Name

TeamMember
ID, TeamID, UserID

Ответы [ 3 ]

3 голосов
/ 16 сентября 2011

Это сырой, но работает:

SELECT t.name
FROM team AS t
JOIN teammember AS tm ON tm.teamID = t.ID
GROUP BY t.Name
HAVING COUNT(tm.id) = (SELECT MAX(members) FROM (SELECT COUNT(id) members FROM teammember GROUP BY teamid) AS sub)
2 голосов
/ 16 сентября 2011

Это заставляет меня чувствовать себя грязным. Он вернет одно имя команды, даже если есть связь - если вы хотите, чтобы в случае связи были все строки, используйте DENSE_RANK() вместо ROW_NUMBER().

SELECT t.ID, t.Name FROM
(
    SELECT 
        TeamID, rn = ROW_NUMBER() OVER (ORDER BY c DESC)
    FROM 
    (
        SELECT TeamID, c = COUNT(*) 
        FROM dbo.TeamMember GROUP BY TeamID
    ) AS x
) AS y
INNER JOIN dbo.Team AS t
ON y.TeamID = t.ID
WHERE y.rn = 1; -- **EDIT** forgot the most important part!

Я бы действительно встал и бросил вызов правилу "нет ТОП 1". Попросите человека, который сказал вам, что по соображениям производительности сравнить производительность вашего существующего запроса с любым из предложенных нами кладжей.

1 голос
/ 16 сентября 2011

ТОП 1 - самый чистый путь.Вот действительно запутанный способ, который мог бы работать:

SELECT ID FROM (

SELECT ID, Tally, MAX(Tally) over (partition by ID) AS MaxTally
  FROM (SELECT t1.ID,
               COUNT(t2.ID) AS Tally
          FROM @Team t1
          JOIN @TeamMember t2
            ON t2.TeamID = t1.ID
         GROUP BY t1.ID) x

) y WHERE Tally = MaxTally
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...