Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL:Lấy số lượng từ nhiều bảng cho một bản ghi người dùng trong bảng USER. Cách tiếp cận tốt nhất là gì?

Sử dụng:

   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

Bạn phải sử dụng kết nối OUTER để điều này nằm trong một truy vấn; Việc tham gia INNER cho tất cả các bảng sẽ yêu cầu người dùng có ít nhất một bản ghi trong bảng FILES, PHOTOS và GROUPS để có trong tập kết quả. Tham gia OUTER có nghĩa là người dùng có bản ghi trong ít nhất một trong các bảng (LỌC, ẢNH hoặc NHÓM) sẽ được trả về.

Nhưng JOIN cũng có nguy cơ thổi phồng tập kết quả, đây là vấn đề đã xảy ra trong phiên bản trước của câu trả lời của tôi. Bằng cách thay đổi truy vấn để sử dụng bảng dẫn xuất / chế độ xem nội tuyến cho số lượng LỌC, NHÓM và ẢNH, vấn đề đã được giải quyết và không cần NHÓM BY bên ngoài bảng dẫn xuất / chế độ xem nội tuyến.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiểu vấn đề đọc bẩn với SQL Server

  2. Những hạn chế đối với SQL Server Compact là gì? (Hoặc - làm thế nào để người ta chọn một cơ sở dữ liệu để sử dụng trên nền tảng MS?)

  3. Định dạng ngày / giờ tùy chỉnh trong SQL Server

  4. Không thực hiện được tác vụ SSIS khi mặt nạ để chọn tệp được tải lên máy chủ FTP bằng WinSCP không khớp với tệp nào

  5. Sẽ tốt hơn nếu thực hiện nhiều lệnh sql với một kết nối hay kết nối lại mọi lúc?