Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL :Obtenir le nombre de plusieurs tables pour un enregistrement d'utilisateur dans la table USER. Quelle est la meilleure approche ?

Utiliser :

   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

Vous devez utiliser des jointures OUTER pour que cela soit dans une seule requête ; Les jointures INNER pour toutes les tables exigeraient que l'utilisateur ait au moins un enregistrement dans la table FILES, PHOTOS et GROUPS pour figurer dans le jeu de résultats. Une jointure OUTER signifie que les utilisateurs avec des enregistrements dans au moins une des tables (FILES, PHOTOS ou GROUPS) seront renvoyés.

Mais les JOIN risquent également de gonfler l'ensemble de résultats, ce qui est le problème qui s'est produit dans la version précédente de ma réponse. En modifiant la requête pour utiliser des tables dérivées/vues en ligne pour les comptes FILES, GROUPS et PHOTOS, le problème est résolu et il n'y a pas besoin d'un GROUP BY en dehors des tables dérivées/vues en ligne.