Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL:Получаване на брой от много таблици за потребителски запис в таблица USER. Какъв е най-добрият подход?

Използвайте:

   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

Трябва да използвате OUTER съединения, за да бъде това в една заявка; Вътрешните съединявания за всички таблици ще изискват потребителят да има поне един запис в таблицата FILES, PHOTOS и GROUPS, за да бъде в набора от резултати. ВЪНШНО присъединяване означава, че ще бъдат върнати потребители със записи в поне една от таблиците (ФАЙЛОВЕ, СНИМКИ или ГРУПИ).

Но JOIN също рискуват да надуят набора от резултати, което е проблемът, който възникна в предишната версия на моя отговор. Чрез промяна на заявката за използване на производни таблици/вградени изгледи за броя на ФАЙЛОВЕ, ГРУПИ и СНИМКИ, проблемът е решен и няма нужда от GROUP BY извън извлечените таблици/вградени изгледи.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Промяна на таблица:Как да промените атрибута „Allow Nulls“ от not null на позволяващ null

  2. Върнете информация за колона за съхранена процедура в SQL Server:sp_sproc_columns

  3. SQL рекурсивна заявка, която получава всички предшественици на елемент

  4. DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) Може ли някой да ми обясни това

  5. ПОКАЗВАНЕ НА ВСИЧКИ данни за дати между две дати; ако не съществува ред за определена дата, покажете нула във всички колони