2012-03-14 23 views
6

Tôi có hai bảng cơ sở dữ liệu, Đội (ID, NAME, CITY, BOSS, TOTALPLAYER) và chơi (ID, NAME, TEAMID, AGE), mối quan hệ giữa hai bảng là một trong nhiều người, một nhóm nghiên cứu có thể có nhiều người chơi.xác định một cột tài liệu tham khảo tính bảng khác

Tôi muốn biết có cách nào để xác định cột TOTALPLAYER trong bảng Team như được tính không?

Ví dụ, nếu có 10 cầu thủ TEAMID là 1, sau đó hàng trong Team bảng mà ID là 1 có cột TOTALPLAYER với giá trị là 10. Nếu tôi thêm một cầu thủ, giá trị TOTALPLAYER cột của đi lên đến 11, tôi không cần phải gán giá trị một cách rõ ràng cho nó, hãy để nó tạo ra bởi cơ sở dữ liệu. Bất cứ ai biết làm thế nào để nhận ra nó?

Thx trước.

BTW, cơ sở dữ liệu SQL Server 2008 R2

+0

Điều gì là sai khi tính toán giá trị trong truy vấn theo yêu cầu? –

Trả lời

9

Vâng, bạn có thể làm điều đó - bạn cần một hàm để đếm các cầu thủ cho đội tuyển, và sử dụng trong cột tính:

CREATE FUNCTION dbo.CountPlayers (@TeamID INT) 
RETURNS INT 
AS BEGIN 
    DECLARE @PlayerCount INT 

    SELECT @PlayerCount = COUNT(*) FROM dbo.Player WHERE TeamID = @TeamID 

    RETURN @PlayerCount 
END 

và sau đó xác định cột tính của bạn:

ALTER TABLE dbo.Team 
ADD TotalPlayers AS dbo.CountPlayers(ID) 

Bây giờ nếu bạn chọn, chức năng đang được gọi là mỗi lần, cho mỗi đội được chọn. Giá trị không được duy trì trong bảng Đội - được tính toán mỗi khi bạn chọn từ bảng Đội.

Vì giá trị của nó không được duy trì, câu hỏi thực sự là: nó cần phải là cột được tính trên bảng hay bạn có thể sử dụng chức năng được lưu trữ để tính toán số lượng người chơi, nếu cần?

+0

Bạn có nghĩa là chức năng sẽ thực thi mọi lúc khi tôi truy vấn một nhóm? – James

+2

@ HeroIverson3: yes - nó sẽ được thực hiện trên mọi SELECT tới bảng bao gồm cột đó (bao gồm cho mỗi 'SELECT * FROM Team') –

+0

Có cách nào khác để nhận ra nó không? Tôi muốn cột chỉ cập nhật khi tôi thêm hoặc xóa một trình phát. khi tôi truy vấn một nhóm, chỉ giống như truy vấn các bảng khác, không có hàm thực hiện. Cảm ơn trước! – James

2

Bạn không cần phải lưu trữ tổng số trong bảng - nó có thể được tính khi bạn làm một truy vấn, một cái gì đó như:

SELECT teams.*, COUNT(players.id) AS num_players 
FROM teams LEFT JOIN players ON teams.id = players.team_id 
GROUP BY teams.id; 

này sẽ tạo ra một cột bổ sung "NUM_PLAYERS" trong truy vấn , sẽ là số lượng người chơi trên mỗi đội, nếu có.

+2

Về cơ bản có, nhưng điều này sẽ không biên dịch trong SQL Server, bởi vì GROUP BY danh sách cột phải bao gồm tất cả các cột không được tổng hợp được tham chiếu trong mệnh đề SELECT. –