2009-12-03 5 views
6

मेरे पास 10 टेबल हैं जो मैं एक दृश्य बनाने के लिए एक साथ जुड़ रहा हूं। मैं केवल प्रत्येक तालिका से आईडी का चयन कर रहा हूं, लेकिन दृश्य में, प्रत्येक आईडी एक से अधिक बार दिखा सकती है, हालांकि सभी आईडी का संयोजन हमेशा अद्वितीय होगा। क्या इस दृश्य में एक और कॉलम बनाने का कोई तरीका है जो एक अद्वितीय आईडी होगा?क्या SQL सर्वर दृश्य में एक अनन्य आईडी बनाना संभव है जो प्रत्येक बार दृश्य कहलाए जाने पर समान रहेगा?

मैं अद्वितीय आईडी स्टोर करने और अन्य सभी आईडी प्राप्त करने के लिए दृश्य के विरुद्ध क्वेरी करने के लिए इसका उपयोग करने में सक्षम होना चाहता हूं।

उत्तर

1

नहीं, आप इसे एक दृश्य में नहीं कर सकते हैं, आप क्या कर सकते हैं यह जानकारी रखने के लिए एक अस्थायी तालिका बनाते हैं और प्रत्येक पंक्ति के लिए एक महत्वपूर्ण या अद्वितीय आईडी बनाते हैं।

+1

+ 1'ed:

यहाँ एक उदाहरण है। लेकिन, अगर वह उस जानकारी को जारी रखना चाहता है, तो यह एक अस्थायी तालिका नहीं होगी, यह एक वास्तविक तालिका होगी। –

+0

@ मार्क हाँ आप सही हैं :)। – JonH

1

मुझे लगता है कि आप ROW_NUMBER() का उपयोग करके ऐसा कर सकते हैं, कम से कम यदि आप दृश्य के ऑर्डर की गारंटी दे सकते हैं। उदाहरण के लिए:

SELECT 
    ROW_NUMBER() OVER (ORDER BY col1, col2, col3) as UniqueId 
FROM <lotsa joins> 

जब तक आदेश वही रहता है, और अंत में केवल फ़ील्ड जोड़े जाते हैं, तो आईडी अद्वितीय होगी।

+0

यह गारंटी नहीं देगा कि संख्याएं हर बार समान होती हैं। अगर मेरे पास (1, 1, 1) और (3, 3, 3) क्रमशः 1 और 2 होंगे। यदि मैं फिर (2, 2, 2) जोड़ता हूं तो (3, 3, 3) पंक्ति अब 3 हो जाएगी और नहीं 2. –

+0

@ टॉम एच: यही कारण है कि मैंने "अगर आप ऑर्डरिंग की गारंटी दे सकते हैं" मेरा जवाब :) – Andomar

+0

ऑर्डरिंग की गारंटी देना हालांकि ऐसा नहीं करता है। यह सिर्फ पंक्तियों का क्रम नहीं है कि यह भी नई पंक्तियों को जोड़ा जा सकता है और पंक्तियों को बदला नहीं जा सकता है। दूसरे शब्दों में, ऑर्डरिंग में बहुत अंत तक पंक्तियों को जोड़ने के अपवाद के साथ डेटा पूरी तरह स्थैतिक होना होगा। –

0

तथ्य यह है कि आप डेटाबेस डिज़ाइन और/या एप्लिकेशन आर्किटेक्चर में बहुत बड़ी समस्याओं के लिए यह करने का प्रयास कर रहे हैं।

चूंकि आपके पास 10 टेबल हैं और मुझे लगता है कि डीबी डिज़ाइनर ने उन सभी तालिकाओं के लिए आईडी पहचान पहचान पर थप्पड़ मार दी है, जिनके बारे में आप समाप्त होंगे (2^31)^10 संभावित पंक्तियां टेबल।

एकमात्र डेटा प्रकार जिसे मैं सोच सकता हूं उस नंबर को कवर कर सकता है, सभी संख्याओं को 0-गद्देदार तारों में अनुवादित करना होगा और उन्हें एक बड़े चार्ज के रूप में एक साथ रखना होगा।

मेरा अनुमान है कि आपकी असली समस्या इस आईडी को देखने के लिए नहीं मिल रही है, लेकिन कुछ अन्य चीज जिसे आप करने का प्रयास कर रहे हैं, यही सवाल है कि आपको पूछना चाहिए। यद्यपि बस एक झुकाव।

+0

हां, मैं पूरी तरह से सहमत हूं, दुर्भाग्यवश यह कुछ है जिसके साथ मैं काम कर रहा हूं, बस इसके बारे में जाने का सबसे अच्छा तरीका ढूंढ रहा हूं। यह एक वाहन डेटाबेस है, इसलिए 50+ टेबल हैं जिनमें प्रत्येक की अपनी आईडी है जो सभी को अगले में शामिल किया जा सकता है। मैं सिर्फ अन्य प्रश्नों को चलाने के लिए बुनियादी जानकारी/आईडी को एक साथ रखने की कोशिश कर रहा हूं: वाहन आईडी, बेडआईडी, बॉडी स्टाइलिड, ब्रेकआईडी, ड्राइव टाइपइप, इंजन कॉन्फिगिड, आदि ... वास्तव में सुंदर नहीं है। – Brendo

0

एक संभावना आपके विचार से एक फ़ंक्शन को कॉल करना होगा जो सभी आईडी कॉलम पर हैश कोड की गणना करता है। यदि आप एक सभ्य क्रिप्टोग्राफिक हैश एल्गोरिदम का उपयोग करते हैं, तो टकराव की बाधाएं कमजोर होती हैं (शायद अधिक संभावना है कि डिस्क खराब डेटा प्रदान करेगी)। इससे भी आसान, आप निश्चित रूप से एक अलग, बहुत बड़ी आईडी, शायद बाइनरी या varbinary कॉलम के रूप में अलग-अलग आईडी को जोड़ सकते हैं।

उस आईडी को संग्रहीत करना और इसके खिलाफ पूछने में सक्षम होना थोड़ा और काम होगा। मैं इसे गणना करने और इसे देखने से स्टोर करने का एक तरीका नहीं सोच सकता। आपको इसे पहले बनाने के लिए शायद संग्रहीत प्रक्रिया की आवश्यकता होगी; विवरण आपके ऐप के विनिर्देशों पर भारी निर्भर करता है।

4

मेरे पास एक समान समस्या थी जहां मुझे कई तालिकाओं में पदानुक्रम स्थापित करने की आवश्यकता थी। यदि आप प्रत्येक तालिका में आईडी के रूप में एक पूर्णांक का उपयोग कर रहे हैं, तो आप बस प्रत्येक तालिका के आईडी को एक वर्चर में परिवर्तित कर सकते हैं और प्रत्येक तालिका के लिए उन्हें एक अलग अक्षर के साथ उपसर्ग कर सकते हैं। उदाहरण

CREATE VIEW LocationHierarchy as

SELECT 'C' + CONVERT(VARCHAR,[Id]) as Id 
     ,[Name] 
     ,'S' + CONVERT(VARCHAR,[State]) as parent 
    FROM [City] 
    UNION 
    SELECT 'S' + CONVERT(VARCHAR,[Id]) as Id 
     ,[Name] 
     ,'C' + CONVERT(VARCHAR,[Suburb]) as parent 
    FROM [Suburb] 

आदि

के लिए इस समाधान के प्रभाव को कैसे बड़े आपके डेटासेट है पर निर्भर करेगा।

+6

@टामागो यह मेरे जैसे उपयोगकर्ताओं के लिए अभी भी उपयोगी है जो एक समान विषय पर शोध कर रहे हैं और उत्तर की तलाश में हैं। –

1

हां, हाल ही में मुझे एक ही आवश्यकता है।

दृश्य बनाते समय, चयन विवरण को TEMP_TABLE के रूप में रखें और फिर पर Row_number() फ़ंक्शन का उपयोग करें।

CREATE VIEW VIEW_NM 
AS 
SELECT Row_number() OVER(ORDER BY column_nm DESC) AS 'RowNumber' FROM 
(SELECT COL1,COL2 FROM TABLE1 
UNION 
SELECT COL1,COL2 FROM TABLE2 
) AS TEMP_TABLE; 
संबंधित मुद्दे