Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL:Mendapatkan hitungan dari banyak tabel untuk catatan pengguna di tabel USER. Apa pendekatan terbaik?

Gunakan:

   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

Anda harus menggunakan gabungan OUTER agar ini berada dalam satu kueri; INNER bergabung untuk semua tabel akan mengharuskan pengguna memiliki setidaknya satu catatan dalam tabel FILES, PHOTOS dan GROUPS untuk berada di hasil. OUTER join berarti bahwa pengguna dengan record di setidaknya salah satu tabel (FILES, PHOTOS atau GROUPS) akan dikembalikan.

Tetapi BERGABUNG juga berisiko menggembungkan hasil, yang merupakan masalah yang terjadi pada versi jawaban saya sebelumnya. Dengan mengubah kueri untuk menggunakan tabel turunan/tampilan sebaris untuk jumlah FILES, GROUPS, dan PHOTOS, masalah terpecahkan dan tidak perlu GROUP BY di luar tabel turunan/tampilan sebaris.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nvarchar(max) masih terpotong

  2. operasi tidak diizinkan ketika objek ditutup saat menjalankan kueri yang lebih maju

  3. Kondisi indeks yang difilter diabaikan oleh pengoptimal

  4. Layanan tidak sepenuhnya berhenti setelah ServiceController.Stop()

  5. Kepatuhan GDPR dan SQL Server Anda