जब आपको 'लापता डेटा' को प्रोजेक्ट करने की आवश्यकता होती है, तो मैंने कई उपयोग किए हैं। उदाहरण के लिए। आपके पास एक समय श्रृंखला (उदाहरण के लिए एक एक्सेस लॉग) है और आप पिछले 30 दिनों के लिए प्रति दिन हिट की संख्या दिखाना चाहते हैं (एनालिटिक्स डैशबोर्ड के बारे में सोचें)। यदि आप करते हैं तो select count(...) from ... group by day
आपको हर दिन के लिए गिनती मिल जाएगी, लेकिन परिणाम में प्रत्येक दिन के लिए एक पंक्ति होगी जो आपके पास वास्तव में कम से कम एक पहुंच थी। दूसरी ओर यदि आप पहली बार अपनी संख्या तालिका ( select dateadd(day, -number, today) as day from numbers
) से दिनों की एक तालिका प्रोजेक्ट करते हैं और फिर आप काउंट्स (या बाहरी आवेदन, जो भी आप कल्पना करते हैं) के साथ जुड़ जाते हैं, तो आपको एक परिणाम मिलेगा जिसमें 0 दिनों के लिए गिनती हो। कोई पहुंच नहीं था। यह तो केवल एक उदाहरण है। बेशक, कोई यह तर्क दे सकता है कि आपके डैशबोर्ड की प्रस्तुति परत लापता दिनों को संभाल सकती है और सिर्फ इसके बजाय एक 0 दिखा सकती है, लेकिन कुछ उपकरण (जैसे। SSRS) बस इसे संभालने में सक्षम नहीं होंगे।
अन्य उदाहरण मैंने देखा है कि सभी प्रकार की विंडो गणनाओं को करने के लिए इसी तरह की श्रृंखला की चालें (दिनांक / समय +/- संख्या) का उपयोग किया जाता है। सामान्य तौर पर, जब भी एक अनिवार्य भाषा में आप एक अच्छी तरह से ज्ञात पुनरावृत्तियों के साथ लूप के लिए उपयोग करेंगे, तो एसक्यूएल की घोषित और निर्धारित प्रकृति एक अंक तालिका के आधार पर एक चाल का उपयोग कर सकती है।
Btw, मैं तथ्य यह है कि यहां तक कि एक संख्या तालिका इसे का उपयोग हालांकि बाहर कॉल करने के लिए की जरूरत महसूस महसूस करता है जरूरी प्रक्रियात्मक निष्पादन की तरह, यह मानते हुए इसके बारे में भ्रम में गिर नहीं है है जरूरी। मुझे एक उदाहरण देने दें:
int x;
for (int i=0;i<1000000;++i)
x = i;
printf("%d",x);
यह कार्यक्रम 999999 का उत्पादन करेगा, इसकी बहुत अधिक गारंटी है।
संख्या तालिका का उपयोग करके SQL सर्वर में समान प्रयास करें। पहले 1,000,000 संख्याओं की एक तालिका बनाएँ:
create table numbers (number int not null primary key);
go
declare @i int = 0
, @j int = 0;
set nocount on;
begin transaction
while @i < 1000
begin
set @j = 0;
while @j < 1000
begin
insert into numbers (number)
values (@j*1000+@i);
set @j += 1;
end
commit;
raiserror (N'Inserted %d*1000', 0, 0, @i)
begin transaction;
set @i += 1;
end
commit
go
अब 'लूप के लिए' करते हैं:
declare @x int;
select @x = number
from numbers with(nolock);
select @x as [@x];
परिणाम है:
@x
-----------
88698
अब आप एक WTF पल होने हैं कर रहे हैं (के बाद सभी number
है संकुल प्राथमिक कुंजी!), चाल कहा जाता है आवंटन आदेश स्कैन और मैं सम्मिलित नहीं किया @j*1000+@i
दुर्घटना से ... तुम भी एक अनुमान उद्यम और कहते हैं कि परिणाम है क्योंकि है था सकता है समानांतरवाद और वह कभी-कभी सही उत्तर हो सकता है।
इस पुल के नीचे कई ट्रोल हैं और मैंने कुछ ऑन SQL सर्वर बूलियन ऑपरेटर शॉर्ट-सर्किट और टी-एसक्यूएल कार्यों का उल्लेख किया है, जो निश्चित रूप से निष्पादन का एक निश्चित क्रम नहीं है