क्या एसक्यूएल को सबक्वेरी की जरूरत है?
संबंध डेटाबेस के लिए संरचित क्वेरी भाषा के पर्याप्त सामान्यीकृत कार्यान्वयन की कल्पना करें। चूंकि विहित एसक्यूएल SELECT
बयान की संरचना वास्तव में इसके लिए बहुत महत्वपूर्ण है, इसलिए मैं सीधे संबंधपरक बीजगणित के लिए अपील नहीं करता हूं, लेकिन आप अभिव्यक्ति के रूप में उचित प्रतिबंध बनाकर उन शब्दों में इसे फ्रेम कर सकते हैं।
एक एसक्यूएल SELECT
क्वेरी आम तौर पर एक प्रक्षेपण (होते SELECT
हिस्सा) की कुछ संख्या JOIN
(संचालन JOIN
भाग), में से कुछ संख्या SELECTION
परिचालन (एसक्यूएल में, WHERE
खंड), और फिर सेट के लिहाज से परिचालन ( UNION
, EXCEPT
, INTERSECT
, आदि), एक और द्वारा पीछा किया SQL SELECT
क्वेरी।
शामिल होने वाली तालिकाएं अभिव्यक्ति के गणना किए गए परिणाम हो सकते हैं; दूसरे शब्दों में, हम एक बयान कर सकते हैं जैसे:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN (SELECT id, address
FROM table2 AS t3
WHERE t3.id = t1.id) AS t2
WHERE t1.salary > 50,000;
हम एक SQL तालिका के एक हिस्से के रूप में एक गणना तालिका के उपयोग को एक उपकुंजी के रूप में संदर्भित करेंगे। ऊपर के उदाहरण में, दूसरा (इंडेंटेड) SELECT
एक उपश्रेणी है।
क्या सभी एसक्यूएल प्रश्नों को इस तरह से लिखा जा सकता है जैसे कि सबक्वेरी का उपयोग न करना? ऊपर का उदाहरण:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
यह उदाहरण कुछ हद तक स्पष्ट या तुच्छ है, लेकिन एक ऐसे उदाहरण की कल्पना कर सकते हैं जहां एक समकक्ष अभिव्यक्ति को पुनर्प्राप्त करने के लिए काफी अधिक प्रयास की आवश्यकता हो सकती है। दूसरे शब्दों में, क्या यह मामला है कि सबक्यूबरीज़ के साथ प्रत्येक एसक्यूएल क्वेरी के लिए, सबक्वेरीज के बिना क्वैरी क्यू मौजूद है जैसे कि क्यू और क्यू ′ समान अंतर्निहित तालिकाओं के लिए समान परिणाम देने की गारंटी है? हमें निम्न प्रकार से SQL क्वेरी को सीमित करें:
SELECT <attribute>,
...,
<attribute>
FROM <a table, not a subquery>
JOIN <a table, not a subquery>
...
JOIN <a table, not a subquery>
WHERE <condition>
AND <condition>
...
AND <condition>
UNION
-or-
EXCEPT
-or-
<similar>
SELECT ...
और इसी तरह। मुझे लगता है कि बाएं और दाएं बाहरी जोड़ बहुत ज्यादा नहीं जोड़ते हैं, लेकिन अगर मुझसे गलती हुई है, तो कृपया बेझिझक कहें कि ... किसी भी घटना में, वे निष्पक्ष खेल हैं। जहाँ तक सेट ऑपरेशंस चलते हैं, मुझे लगता है कि उनमें से कोई भी ठीक है ... संघ, अंतर, सममित अंतर, प्रतिच्छेदन, आदि ... कुछ भी जो सहायक है। क्या ऐसे कोई ज्ञात रूप हैं जिनसे सभी एसक्यूएल प्रश्नों को कम किया जा सकता है? क्या इनमें से कोई भी सबकुछ खत्म कर देता है? या ऐसे कुछ उदाहरण हैं जहां कोई समान, सबक्वेरी-फ्री क्वेरी मौजूद नहीं है? संदर्भ की सराहना की जाती है ... या एक प्रदर्शन (प्रमाण द्वारा) कि वे आवश्यक हैं या नहीं शानदार होंगे। धन्यवाद, और खेद है कि अगर यह एक मनाया (या तुच्छ) परिणाम है, जिसमें मैं दर्द से अंजान हूं।
select count(*) from (select id from sometable group by id having count(*)>1) d
:। क्योंकि इसमें शामिल है group by
मैंने इसे उत्तर के रूप में नहीं रखा है।
ON
क्लॉज की आवश्यकता होती है JOIN
, हालांकि एक क्रॉस उत्पाद सिर्फ अल्पविराम के साथ प्राप्त किया जाता है।