sql >> Databáze >  >> RDS >> Sqlserver

SQL:Získávání počtu z mnoha tabulek pro záznam uživatele v tabulce USER. Jaký je nejlepší přístup?

Použijte:

   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

Aby to bylo v jednom dotazu, musíte použít OUTER spojení; VNITŘNÍ spojení pro všechny tabulky by vyžadovalo, aby uživatel měl alespoň jeden záznam v tabulce FILES, PHOTOS a GROUPS, aby byl v sadě výsledků. VNĚJŠÍ spojení znamená, že budou vráceni uživatelé se záznamy alespoň v jedné z tabulek (FILES, PHOTOS nebo GROUPS).

JOINy ​​však také riskují nafouknutí sady výsledků, což je problém, který se vyskytl v předchozí verzi mé odpovědi. Změnou dotazu na použití odvozených tabulek/vložených pohledů pro počty FILES, GROUPS a PHOTOS je problém vyřešen a není potřeba GROUP BY mimo odvozené tabulky/inline pohledy.




  1. sql pořadí podle s vnitřní klauzulí výběru a seskupení podle souhrnu

  2. Proč se dotaz neuloží do souboru csv, když se to v konzoli postgresql zdá normální

  3. Proč nám Oracle SQL neumožňuje používat aliasy sloupců v klauzulích GROUP BY?

  4. Ztratilo se připojení k serveru MySQL při „čtení počátečního komunikačního paketu“, systémová chyba:0