में एम्यूलेट MySQL LIMIT क्लॉज जब मैंने Zend Framework's database component पर काम किया, तो हमने LIMIT
क्लॉज की कार्यक्षमता को MySQL, PostgreSQL, और SQLite द्वारा समर्थित करने की कोशिश की।माइक्रोसॉफ्ट एसक्यूएल सर्वर 2000
$select = $db->select();
$select->from('mytable');
$select->order('somecolumn');
$select->limit(10, 20);
डेटाबेस LIMIT
का समर्थन करता है, तो यह निम्नलिखित की तरह एक SQL क्वेरी का उत्पादन: यही कारण है, एक प्रश्न बनाने इस तरह से किया जा सकता है है डेटाबेस के ब्रांडों के लिए
SELECT * FROM mytable ORDER BY somecolumn LIMIT 10, 20
यह किया गया था और अधिक जटिल है कि LIMIT
का समर्थन न करें (वह खंड मानक SQL भाषा का हिस्सा नहीं है)। यदि आप पंक्ति संख्याएं उत्पन्न कर सकते हैं, तो संपूर्ण क्वेरी को व्युत्पन्न तालिका बनाएं, और बाहरी क्वेरी में BETWEEN
का उपयोग करें। यह ओरेकल और आईबीएम डीबी 2 के लिए समाधान था।
SELECT z2.*
FROM (
SELECT ROW_NUMBER OVER(ORDER BY id) AS zend_db_rownum, z1.*
FROM (...original SQL query...) z1
) z2
WHERE z2.zend_db_rownum BETWEEN @offset+1 AND @[email protected];
हालांकि, Microsoft SQL सर्वर 2000 ROW_NUMBER()
समारोह नहीं है: तो एक क्वेरी इस तरह से लिख सकते हैं माइक्रोसॉफ्ट SQL सर्वर 2005, एक ऐसी ही पंक्ति संख्या समारोह है।
तो मेरा सवाल यह है कि, क्या आप माइक्रोसॉफ्ट एसक्यूएल सर्वर 2000 में LIMIT
कार्यक्षमता अनुकरण करने के लिए पूरी तरह से एसक्यूएल का उपयोग कर सकते हैं? कर्सर या टी-एसक्यूएल या संग्रहीत प्रक्रिया का उपयोग किए बिना। इसे LIMIT
, दोनों गिनती और ऑफसेट के लिए दोनों तर्कों का समर्थन करना होगा। एक अस्थायी तालिका का उपयोग कर समाधान भी स्वीकार्य नहीं हैं।
संपादित करें:
एमएस एसक्यूएल सर्वर 2000 के लिए सबसे आम समाधान, नीचे दिए गए एक तरह बनना उदाहरण 75 के माध्यम से पंक्तियों 50 पाने के लिए लगता है:
SELECT TOP 25 *
FROM (
SELECT TOP 75 *
FROM table
ORDER BY BY field ASC
) a
ORDER BY field DESC;
बहरहाल, यह नहीं करता है ' यदि कुल परिणाम सेट है तो 60 काम करें, 60 पंक्तियां कहें। आंतरिक क्वेरी 60 पंक्तियों को लौटाती है क्योंकि यह शीर्ष 75 में है। फिर बाहरी क्वेरी पंक्ति 35-60 लौटाती है, जो 50-75 के वांछित "पृष्ठ" में फिट नहीं होती है। असल में, यह समाधान तब तक काम करता है जब तक आपको परिणाम सेट के अंतिम "पृष्ठ" की आवश्यकता न हो जो पेज आकार के एकाधिक न हों।
संपादित करें:
एक अन्य समाधान बेहतर काम करता है, लेकिन केवल तभी जब आप परिणाम सेट मान सकते हैं एक स्तंभ है कि अद्वितीय है में शामिल हैं:
SELECT TOP n *
FROM tablename
WHERE key NOT IN (
SELECT TOP x key
FROM tablename
ORDER BY key
);
निष्कर्ष:
कोई सामान्य- एमएस एसक्यूएल सर्वर 2000 में LIMIT
को अनुकरण करने के लिए प्रोजेक्ट समाधान मौजूद है। यदि आप ROW_NUMBER()
फ़ंक्शन का उपयोग कर सकते हैं तो एक अच्छा समाधान मौजूद है एमएस एसक्यूएल सर्वर में आयन 2005.
हाँ, यह करीब है, लेकिन यह केवल काम करता है जब वहाँ अंतरिम क्वेरी परिणाम में एक अद्वितीय कुंजी है। आप ग्रुप बाय क्वेरी में या एक क्वेरी के लिए कैसे करेंगे जो कई तालिकाओं में शामिल हो? –