Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL:Abrufen der Anzahl aus vielen Tabellen für einen Benutzerdatensatz in der USER-Tabelle. Was ist der beste Ansatz?

Verwendung:

   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

Sie müssen OUTER-Joins verwenden, damit dies in einer Abfrage enthalten ist. INNER Joins für alle Tabellen würden erfordern, dass der Benutzer mindestens einen Datensatz in den Tabellen FILES, PHOTOS und GROUPS hat, um in der Ergebnismenge enthalten zu sein. Ein OUTER Join bedeutet, dass Benutzer mit Datensätzen in mindestens einer der Tabellen (FILES, PHOTOS oder GROUPS) zurückgegeben werden.

JOINs riskieren jedoch auch, die Ergebnismenge aufzublähen, was das Problem ist, das in der vorherigen Version meiner Antwort aufgetreten ist. Indem Sie die Abfrage ändern, um abgeleitete Tabellen/Inline-Ansichten für die FILES-, GROUPS- und PHOTOS-Zählungen zu verwenden, wird das Problem gelöst und es besteht keine Notwendigkeit für ein GROUP BY außerhalb der abgeleiteten Tabellen/Inline-Ansichten.