मुझे लगता है कि मुख्य समस्या यह है कि सभी डेटाबेस कॉमन टेबल एक्सप्रेशन का समर्थन नहीं करते हैं।
मेरे नियोक्ता एक महान कई चीजों के लिए DB / 2 का उपयोग करते हैं। इसके नवीनतम संस्करण सीटीई का समर्थन करते हैं, जैसे कि मैं चीजों को करने में सक्षम हूं:
with custs as (
select acct# as accountNumber, cfname as firstName, clname as lastName,
from wrdCsts
where -- various criteria
)
, accounts as (
select acct# as accountNumber, crBal as currentBalance
from crzyAcctTbl
)
select firstName, lastName, currentBalance
from custs
inner join accounts on custs.accountNumber = accounts.accountNumber
इसका परिणाम यह है कि हमारे पास भारी संक्षिप्त तालिका / फ़ील्ड नाम हो सकते हैं और मैं अनिवार्य रूप से अधिक सुपाठ्य नामों के साथ अस्थायी विचार बना रहा हूं, जिसका मैं फिर उपयोग कर सकता हूं। यकीन है, क्वेरी लंबी हो जाती है। लेकिन नतीजा यह है कि मैं कुछ लिख सकता हूं जो बहुत स्पष्ट रूप से अलग है (सीटीई का उपयोग करके आप डीआरवाई प्राप्त करने के लिए फ़ंक्शन का उपयोग करेंगे) और कोड के साथ समाप्त होता है जो काफी सुपाठ्य है। और क्योंकि मैं अपनी उपश्रेणियों को तोड़ने में सक्षम हूं, और एक उपश्रेणी का संदर्भ दूसरा है, यह सब "इनलाइन" नहीं है। मेरे पास इस अवसर पर, एक CTE लिखा है, फिर चार अन्य CTE के पास यह सब संदर्भ है, तब मुख्य क्वेरी संघ के अंतिम चार के परिणाम थे।
इसके साथ किया जा सकता है:
- डीबी / 2
- PostgreSQL
- आकाशवाणी
- एमएस SQL सर्वर
- MySQL (नवीनतम संस्करण; अभी भी थोड़े नया)
- शायद दूसरों को
लेकिन यह कोड क्लीनर, अधिक सुपाठ्य, अधिक DRY बनाने की दिशा में एक लंबा रास्ता तय करता है।
मैंने सीटीई की एक "मानक लाइब्रेरी" विकसित की है जिसे मैं विभिन्न प्रश्नों के लिए प्लग-इन कर सकता हूं, जो मुझे मेरी नई क्वेरी पर उड़ान शुरू करने के लिए बंद कर देगा। उनमें से कुछ मेरे संगठन में अन्य देवों द्वारा भी गले लगने लगे हैं।
समय के साथ, इनमें से कुछ को विचारों में बदलने का कोई मतलब हो सकता है, जैसे कि यह "मानक पुस्तकालय" कॉपी / पेस्ट करने की आवश्यकता के बिना उपलब्ध है। लेकिन मेरी CTEs अंत में कभी-कभार, कभी-कभार, बहुत कम समय के लिए, बिना किसी CTE के SO WIDELY, बिना मॉड्स के उपयोग में लाने में सक्षम हो जाती है, कि यह देखने लायक हो सकती है।
ऐसा लगता है कि आपके पकड़ का हिस्सा "मुझे सीटीई के बारे में क्यों नहीं पता है?" या "मेरा DB सीटीई का समर्थन क्यों नहीं करता है?"
अपडेट के लिए ... हाँ, आप सीटीई का उपयोग कर सकते हैं लेकिन, मेरे अनुभव में, आपको उन्हें सेट क्लॉज़ के अंदर और जहाँ क्लॉज़ में उपयोग करना है। यह अच्छा होगा यदि आप पूरे अपडेट स्टेटमेंट में से एक या अधिक को परिभाषित कर सकते हैं और फिर सेट में "मुख्य क्वेरी" भागों / जहां क्लॉस होते हैं, लेकिन यह उस तरह से काम नहीं करता है। और आपके द्वारा अपडेट की जा रही मेज पर अस्पष्ट तालिका / फ़ील्ड नामों से कोई परहेज नहीं है।
आप हटाने के लिए सीटीई का उपयोग कर सकते हैं। आप उस तालिका से रिकॉर्ड करने के लिए PK / FK मान निर्धारित करने के लिए कई CTEs ले सकते हैं। फिर, आप जिस तालिका को संशोधित कर रहे हैं, उस पर अस्पष्ट तालिका / फ़ील्ड नामों से बच नहीं सकते।
जब आप किसी इंसर्ट का चयन कर सकते हैं, तो आप इनसर्ट का उपयोग इंसर्ट के लिए कर सकते हैं। हमेशा की तरह, आप जिस टेबल को संशोधित कर रहे हैं, उस पर अस्पष्ट तालिका / फ़ील्ड नामों के साथ काम कर सकते हैं।
एसक्यूएल आपको गेटर्स / सेटर्स के साथ, टेबल को लपेटकर, डोमेन ऑब्जेक्ट के बराबर बनाने की अनुमति नहीं देता है। उसके लिए, आपको अधिक प्रक्रियात्मक / OO प्रोग्रामिंग भाषा के साथ, किसी प्रकार के ORM का उपयोग करने की आवश्यकता होगी। मैंने जावा / हाइबरनेट में इस प्रकृति की बातें लिखी हैं।