sql >> Base de Datos >  >> RDS >> Sqlserver

SQL:obtener el recuento de muchas tablas para un registro de usuario en la tabla de USUARIO. ¿Cuál es el mejor enfoque?

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

Debe usar combinaciones EXTERNAS para que esto esté en una consulta; Las uniones INNER para todas las tablas requerirían que el usuario tenga al menos un registro en la tabla ARCHIVOS, FOTOS y GRUPOS para estar en el conjunto de resultados. Una unión EXTERNA significa que se devolverán los usuarios con registros en al menos una de las tablas (ARCHIVOS, FOTOS o GRUPOS).

Pero JOIN también corre el riesgo de inflar el conjunto de resultados, que es el problema que ocurrió en la versión anterior de mi respuesta. Al cambiar la consulta para usar tablas derivadas/vistas en línea para el conteo de ARCHIVOS, GRUPOS y FOTOS, el problema se resuelve y no hay necesidad de un GRUPO POR fuera de las tablas derivadas/vistas en línea.