मान लें कि मेरे पास एक पूर्णांक कॉलम आईडी वाला एक टेबल है। मुझे missing numbers को sequence में अधिकतम लौटाई गई राशि के साथ खोजने की आवश्यकता है।

  • अगर टेबल खाली है और मैं 10 मांग रहा हूं, तो उसे 1-10 नंबर वापस करने चाहिए।
  • यदि तालिका में 1-5 है और मैं 10 मांग रहा हूं, तो इसे 6,7,8,9,10,11,12,13,14,15 नंबर वापस करना चाहिए।
  • यदि तालिका में 1,2,4,6,9 है और मैं 10 मांग रहा हूं, तो उसे 3,5,7,8,10,11,12,13,14,15 नंबर वापस करना चाहिए

मैं इसे MS SQL का उपयोग करके एक ही प्रश्न में कैसे प्राप्त कर सकता हूं?

अग्रिम में धन्यवाद!

1
Lasse O 27 मार्च 2018, 13:44

2 जवाब

सबसे बढ़िया उत्तर

ये कोशिश करें:

यदि आपको अधिक संख्या प्राप्त करने की आवश्यकता है, तो बस WHERE Number<=100 बढ़ा दें।

DECLARE @Tab1 TABLE (ID INT)

INSERT INTO @Tab1 VALUES(1)
INSERT INTO @Tab1 VALUES(3)
INSERT INTO @Tab1 VALUES(5)
INSERT INTO @Tab1 VALUES(7)
INSERT INTO @Tab1 VALUES(9)

;WITH CTE AS
(
    SELECT 1 AS Number
    UNION ALL
    SELECT Number + 1 FROM CTE
    WHERE Number<=100
)
SELECT TOP 5 *
FROM CTE
WHERE Number NOT IN(SELECT ID FROM @Tab1)
ORDER BY Number
OPTION (maxrecursion 0);

मौजूदा मान:

Number
1
3
5
7
9

आउटपुट:

Number
2
4
6
8
10

आशा है कि यह आपकी मदद करता है।

4
DineshDB 27 मार्च 2018, 14:34
आशाजनक लग रहा है .. यह क्या करता है: सीटीई एएस के साथ (संख्या के रूप में 1 चुनें यूनियन सभी चयन संख्या + 1 सीटीई से जहां संख्या<=100)
 – 
Lasse O
27 मार्च 2018, 14:02
@LasseO, यह क्रम में संख्याएँ उत्पन्न करने के लिए है। उस क्रम का उपयोग करके हम तालिका से मौजूदा संख्याओं को हटा देते हैं।
 – 
DineshDB
27 मार्च 2018, 14:03
मैं इसका उपयोग यह प्राप्त करने के लिए कर रहा हूं कि कौन सी फ़ाइल खंड आईडी अभी तक अपलोड नहीं हुई है। हालांकि हजारों टुकड़े हो सकते हैं। मेरा मानना ​​है कि यह केवल 100 सेशन का समर्थन करता है?
 – 
Lasse O
27 मार्च 2018, 14:29
@LasseO, मैंने आपको उत्तर में स्पष्ट रूप से यही कहा है। यदि आपको अधिक संख्या की आवश्यकता है, तो आप where स्थिति में CTE के अंदर मान बढ़ाते हैं।
 – 
DineshDB
27 मार्च 2018, 14:31

यह काम करना चाहिए
संख्याओं के साथ एक सिस्टम टेबल भी है

declare @T table (i int primary key);
insert into @T values (1), (2), (4), (6), (9); 
declare @count int = 10;
declare @size int = (select count(*) from @T);
with cte as
( select 1 as num
  union all 
  select num + 1 
  from cte
  where num + 1 <= (@count + @size)
)
select top (@count) cte.num 
from cte 
left join @T t 
  on t.i = cte.num 
where t.i is null 
order by cte.num 
option ( MaxRecursion 0 );
1
paparazzo 27 मार्च 2018, 14:39