उपश्रेणी के उपनाम मुख्य प्रश्नों के उपनाम के समान हैं


23

मेरे पास एक SQL क्वेरी है, जिसके उपनाम उसके कुछ उप-वर्ग के उपनामों के समान हैं।

उदाहरण के लिए:

select *
from ROOM r
where ...
         (
              select *
              from ROAD r
              where ...
         )

यह ठीक काम करता है, क्योंकि उपश्रेणी का उपनाम मुख्य को छिपाने के लिए लगता है।

  1. क्या यह सभी मामलों में उस तरह से काम करेगा?
  2. क्या मुझे कभी अपरिभाषित परिणाम मिलेंगे?
  3. यदि ऐसा करना ठीक है, तो मैं मुख्य प्रश्न के संदर्भ को कैसे बना सकता हूं r?

1
लघु उत्तर "1.Yes", "2.नहीं" और "3. इस मामले में, आप नहीं कर सकते (इसलिए यह वास्तव में ठीक नहीं है यदि आप ऐसा संदर्भ बनाना चाहते हैं)"
ypercubeᵀᴹ

जवाबों:


15

यह नेस्टेड उपश्रेणियों के लिए मूल उपनाम में उपयोग किए गए समान उपनामों का उपयोग करने के लिए ठीक है, हालांकि यह कोड पढ़ने वाले किसी व्यक्ति के लिए थोड़ा भ्रमित हो सकता है। एक नेस्टेड सबक्वेरी पर उपनामों के लिए नाम स्थान माता-पिता पर नाम स्थान से अलग है। उदाहरण के लिए नीचे दिए गए क्वेरी में एक नेस्टेड सबक्विरी है bजिसमें उसके bभीतर एक उपनाम भी है । यह संभावित रूप से प्रोग्रामर को भ्रमित करेगा लेकिन DBMS इंजन के साथ ठीक है:

   select a.foo
          ,b.bar
          ,b.BarCount
      from (select b.bar
                  ,count (*) as BarCount
              from BarTable b
              join OtherTable o
                on b.OtherTableID = o.OtherTableID
             group by b.bar) b
      join Foobar a
        on a.bar = b.bar

एक सहसंबंधित उप-वर्ग पर आपके पास माता-पिता के उपनामों तक पहुंच है, इसलिए उपनामों को मूल क्वेरी और सहसंबद्ध उपश्रेणी में अद्वितीय होना चाहिए। यदि हम एक सहसंबंधित उप-वर्ग लेते हैं जैसे कि नीचे एक, हमारे पास एक एकल, वैश्विक नाम स्थान है जिसे मूल क्वेरी और सहसंबद्ध उपकुंजी के बीच साझा किया गया है:

select a.foo
      ,b.bar
  from Foobar a
  join Bar b
    on b.FooBarID = a.FooBarID
 where not exists
       (select 1
          from Bar b2
         where b2.BarCategoryID = b.BarCategoryID
           and b2.BarDate > b.BarDate)

सहसंबंधित उप-वर्ग में एक उपनाम नहीं है क्योंकि यह ऐसे 1 के रूप में शामिल नहीं होता है । संदर्भ bऔर के b2लिए barदोनों उपसमुच्चय के लिए उपलब्ध हैं क्योंकि सहसंबद्ध उपश्रेणियाँ माता-पिता के साथ उपनाम के लिए उनके नाम स्थान को साझा करती हैं।


1 ध्यान दें कि ऑप्टिमाइज़र पर्दे के पीछे की योजना के भीतर शामिल होने वाले ऑपरेटरों का उपयोग करने का विकल्प चुन सकता है, हालांकि निर्दिष्ट वास्तविक ऑपरेशन एक सहसंबद्ध उपश्रेणी है और एक नेस्टेड उपश्रेणी के खिलाफ शामिल नहीं है।


पहली क्वेरी में उपश्रेणी एक व्युत्पन्न तालिका है और मानक SQL को इसे हमेशा एक नाम देने की आवश्यकता होती है: इस आवश्यकता के लिए कोई तार्किक कारण नहीं है, लेकिन SQL सर्वर ने इसे वैसे भी लागू किया है, हालांकि विशेष उदाहरण में आपने एक नाम चुना है वास्तव में की आवश्यकता है। दूसरी क्वेरी में उपश्रेणी एक व्युत्पन्न तालिका नहीं है, इसलिए इसे एक नाम की आवश्यकता नहीं है (तथ्य यह है कि यह सहसंबंधित उपशम सारहीन है)।
onedaywhen

@onedaywhen - मैं किसी भी स्थिति के बारे में नहीं सोच सकता, लेकिन एक सहसंबंधित उप-क्षेत्र जहां उप-वर्ग को माता-पिता में उपयोग किए जाने वाले उपनामों तक पहुंच की आवश्यकता होती है। क्या आपके मन में कुछ विशिष्ट था?
कंसर्नडऑफटुनब्रिजवेल्स

मुझे यकीन नहीं है कि मैं आपके सवाल को समझ सकता हूँ। शायद मुझे यह स्पष्ट करना चाहिए कि मैं विशेष रूप से आपकी टिप्पणी का जवाब दे रहा था, "सहसंबंधित उपशम में एक उपनाम नहीं है क्योंकि यह इस तरह के रूप में शामिल नहीं होता है।" मेरी प्रतिक्रिया को इस बात से अवगत कराना था कि रेंज वैरिएबल (SQL मानक कॉल 'सहसंबंध नाम' और आप 'उपनाम' कहते हैं) से संबंधित नियम सीधे उनकी भागीदारी (या अन्यथा) से संबंधित नहीं हैं।
onedaywhen

सरल उदाहरण: SELECT * FROM ( SELECT c FROM T ) AS T2;- कोई जुड़ता है, कोई सहसंबंध नहीं है फिर भी एसक्यूएल मानक की आवश्यकता है कि व्युत्पन्न तालिका को रेंज चर ( T2इस मामले में) सौंपा जाए ।
onedaywhen

3

ConcernedOfTunbridgeWells, आप लिखते हैं (जोर मेरा): "एक सहसंबद्ध उपसमुच्चय पर आपके पास माता-पिता के उपनामों तक पहुंच है, इसलिए उपनामों को मूल क्वेरी और सहसंबद्ध उपश्रेणी में अद्वितीय होना चाहिए।"

मेरा मानना ​​है कि विशिष्टता की आवश्यकता नहीं है। मेरा मानना ​​है कि, अगर एक सहसंबंधी उपकथा में एक उपनाम का उपयोग सहसंबंध नाम के रूप में किया जाता है, साथ ही बाहरी क्वेरी में एक तालिका उपनाम भी होता है, तो उपकथा में अन्य उपनाम पूर्ववर्तीता लेगा।

उदाहरण:

CREATE TABLE #T (A INT)
CREATE TABLE #U (A INT)
CREATE TABLE #V (A INT)

INSERT INTO #T (A) VALUES (1), (2), (3)
INSERT INTO #U (A) VALUES (2), (3), (4)
INSERT INTO #V (A) VALUES (3), (4), (5)

SELECT
    T1.A
FROM
    #T AS T1
    INNER JOIN #U AS T2 ON T1.A = T2.A
WHERE
    EXISTS (SELECT * FROM #V AS T2 WHERE T1.A = T2.A)

आउटपुट "3" है: टेबल टी और यू में 2 और 3 आम हैं, लेकिन WHEREविधेय आगे पंक्तियों को 3 पर लौटाता है, और 2 वी में मौजूद नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.