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

SQL:Får tal fra mange tabeller for en brugerpost i USER-tabellen. Hvad er den bedste fremgangsmåde?

Brug:

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

Du skal bruge OUTER joins for at dette skal være i én forespørgsel; INNER joins for alle tabellerne vil kræve, at brugeren har mindst én post i FILES, PHOTOS og GROUPS-tabellen for at være i resultatsættet. En OUTER join betyder, at brugere med poster i mindst én af tabellerne (FILER, FOTO eller GRUPPER) vil blive returneret.

Men JOINs risikerer også at puste resultatet op, hvilket er det problem, der opstod i den tidligere version af mit svar. Ved at ændre forespørgslen til at bruge afledte tabeller/indlejrede visninger til FILES, GROUPS og FOTO-tællingerne, er problemet løst, og der er ikke behov for en GROUP BY uden for de afledte tabeller/inlinevisninger.




  1. Oracle DB til EF fungerer ikke korrekt for NUMBER(2,0)

  2. TEXT vs VARCHAR i InnoDB MySQL 5.5. Hvornår skal man bruge hver enkelt

  3. SQL Server Like Query skelner ikke mellem store og små bogstaver

  4. Placering af MySQL-konfigurationsfil (dvs.:my.cnf) er ikke angivet