Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL:ottenere il conteggio da molte tabelle per un record utente nella tabella USER. Qual è l'approccio migliore?

Usa:

   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

Devi usare i join OUTER affinché questo sia in una query; I join INNER per tutte le tabelle richiederebbero che l'utente disponga di almeno un record nella tabella FILES, PHOTOS e GROUPS per essere nel set di risultati. Un join OUTER significa che verranno restituiti gli utenti con record in almeno una delle tabelle (FILES, FOTO o GRUPPI).

Ma i JOIN rischiano anche di gonfiare il set di risultati, che è il problema che si è verificato nella versione precedente della mia risposta. Modificando la query per utilizzare tabelle derivate/viste in linea per i conteggi di FILE, GRUPPI e FOTO, il problema è risolto e non è necessario un GROUP BY al di fuori delle tabelle derivate/viste in linea.