sql >> Database >  >> RDS >> Sqlserver

SQL:Telling krijgen uit veel tabellen voor een gebruikersrecord in de USER-tabel. Wat is de beste aanpak?

Gebruik:

   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

U moet OUTER-joins gebruiken om dit in één query te doen; INNER-joins voor alle tabellen vereisen dat de gebruiker ten minste één record in de tabel FILES, PHOTOS en GROUPS in de resultatenset heeft. Een OUTER-join betekent dat gebruikers met records in ten minste één van de tabellen (FILES, PHOTOS of GROEPEN) worden geretourneerd.

Maar JOIN's lopen ook het risico de resultatenset op te blazen, wat het probleem is dat zich voordeed in de vorige versie van mijn antwoord. Door de query te wijzigen om afgeleide tabellen/inline views te gebruiken voor de FILES, GROEPEN en PHOTOS tellingen, is het probleem opgelost en is er geen GROUP BY nodig buiten de afgeleide tabellen/inline views.




  1. Hoe dwing ik Postgres om een ​​bepaalde index te gebruiken?

  2. Afbeeldingen uploaden met behulp van arrays en ophaalfouten

  3. QUOTED_IDENTIFIER begrijpen

  4. Een login.sql-bestand maken voor SQLcl