Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL:Obtendo contagem de muitas tabelas para um registro de usuário na tabela USER. Qual é a melhor abordagem?


Usar:
   SELECT u.userid,
          u.username,
          COALESCE(f.numFiles, 0) AS numFiles,
          COALESCE(p.numPhotos, 0) AS numFiles,
          COALESCE(g.numGroups, 0) AS numGroups
     FROM [USER] u
LEFT JOIN (SELECT t.userid,
                  COUNT(*) AS numFiles
             FROM [FILES] t
         GROUP BY t.userid)f ON f.userid = u.userid
LEFT JOIN (SELECT t.userid,
                  COUNT(*) AS numPhotos
             FROM [PHOTOS] t
         GROUP BY t.userid) p ON p.userid = u.userid
LEFT JOIN (SELECT t.userid,
                  COUNT(*) AS numGroups
             FROM [GROUPS] t
         GROUP BY t.userid) g ON g.userid = u.userid
    WHERE u.userid = 2

Você precisa usar junções OUTER para que isso esteja em uma consulta; Junções INNER para todas as tabelas exigiriam que o usuário tivesse pelo menos um registro na tabela FILES, PHOTOS e GROUPS para estar no conjunto de resultados. Uma junção OUTER significa que os usuários com registros em pelo menos uma das tabelas (FILES, PHOTOS ou GROUPS) serão retornados.

Mas os JOINs também correm o risco de inflar o conjunto de resultados, que é o problema que ocorreu na versão anterior da minha resposta. Ao alterar a consulta para usar tabelas derivadas/visualizações embutidas para as contagens de ARQUIVOS, GRUPOS e FOTOS, o problema é resolvido e não há necessidade de um GROUP BY fora das tabelas derivadas/visualizações embutidas.