2012-03-14 22 views
6

परिभाषित मैं दो डेटाबेस तालिकाओं, टीम (ID, NAME, CITY, BOSS, TOTALPLAYER) और प्लेयर (ID, NAME, TEAMID, AGE) है, दो तालिकाओं के बीच संबंध एक कई लोगों के लिए, एक ही टीम में कई खिलाड़ी कर सकते हैं।एक गणना स्तंभ संदर्भ एक और तालिका

मैं जानना चाहता हूं कि Team तालिका में गणना के रूप में TOTALPLAYER कॉलम को परिभाषित करने का कोई तरीका है?

उदाहरण के लिए, अगर वहाँ 10 खिलाड़ियों के TEAMID, 1 है तो Team तालिका जो ID मैं एक खिलाड़ी जोड़ देते हैं तो 1 से 10 के एक मूल्य के साथ TOTALPLAYER स्तंभ है है में पंक्ति, TOTALPLAYER स्तंभ के मूल्य पर निर्भर हो जाता है 11, मुझे इसे स्पष्ट रूप से मान निर्दिष्ट करने की आवश्यकता नहीं है, इसे डेटाबेस द्वारा जेनरेट करने दें। किसी को पता है कि इसे कैसे महसूस किया जाए?

अग्रिम में Thx।

Btw, डेटाबेस SQL ​​सर्वर 2008 R2

+0

मांग पर किसी प्रश्न में मूल्य की गणना करने में क्या गलत है? –

उत्तर

9

हाँ है, तो आप ऐसा कर सकते हैं - आप टीम के लिए खिलाड़ियों को भरोसा है, और का उपयोग करें कि गणना स्तंभ में करने के लिए एक समारोह की जरूरत है:

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 

और फिर अपने अभिकलन स्तंभ को परिभाषित: यदि आप का चयन अब

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

, कि समारोह हर बार बुलाया जा रहा है, प्रत्येक टीम का चयन किया जा रहा है के लिए। मूल्य टीम तालिका में जारी नहीं है - प्रत्येक बार जब आप टीम तालिका से चुनते हैं तो यह फ्लाई पर गणना की जाती है।

चूंकि इसका मान जारी नहीं है, सवाल वास्तव में है: क्या इसे तालिका पर एक गणना कॉलम होने की आवश्यकता है, या यदि आप आवश्यक हो तो खिलाड़ियों की संख्या की गणना करने के लिए बस संग्रहीत फ़ंक्शन का उपयोग कर सकते हैं?

+0

क्या आपका मतलब है कि जब भी मैं टीम से पूछता हूं तो फ़ंक्शन हर बार निष्पादित होगा? – James

+2

@ HeroIverson3: हाँ - इसे तालिका में प्रत्येक चयन पर निष्पादित किया जाएगा जिसमें उस कॉलम (प्रत्येक 'चयन * टीम से' के लिए शामिल है) –

+0

क्या इसका एहसास करने का कोई और तरीका है? मैं चाहता हूं कि कॉलम केवल तभी अपडेट हो जब मैं कोई खिलाड़ी जोड़ूं या हटा दूं। जब मैं किसी टीम से पूछताछ करता हूं, फ़ंक्शन निष्पादित किए बिना केवल अन्य तालिकाओं की क्वेरी करता हूं। अग्रिम में धन्यवाद! – James

2

आप तालिका में कुल स्टोर करने के लिए नहीं है - यह गणना की जा सकती है जब आप एक प्रश्न करते हैं, कुछ की तरह:

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

इस क्वेरी में एक अतिरिक्त स्तंभ "NUM_PLAYERS" पैदा करेगा , जो कि प्रत्येक टीम, यदि कोई हो, पर खिलाड़ियों की संख्या की गणना होगी।

+2

से भी मूल रूप से हां है, लेकिन यह SQL सर्वर में संकलित नहीं होगा, क्योंकि ग्रुप बाय कॉलम सूची में चयन खंड में संदर्भित सभी गैर-समेकित कॉलम शामिल होना चाहिए। –

संबंधित मुद्दे